利用plt.pcolormesh绘制分类图

用pcolormesh()能画的, 用scatter()也能画, 但是经过测试, 发现用scatter()画的速度比pcolormesh()要慢不少 - -

plt.pcolormesh(X,Y,Z,cmap=cm)

X,Y:指的是二维网格面每一个点的横纵坐标 Z:(X,Y) :坐标处的颜色值 cmap:着色方案

pcolormesh 的作用是: 用不规则的矩形网格创建伪彩色图。

'''
多元分类:逻辑回归分类器 并绘制pcolormesh伪彩图
sklearn.linear_model.LogisticRegression(
        solver='liblinear',
        C=正则强度)
'''
# pcolormesh(x, y, c=d, cmap='jet') cmap:渐变色映射

plt.pcolormesh(...):

    a = np.array([1, 2, 3])
    b = np.array([-1, -2, -3, -4])

    a.shape, b.shape
    Out[55]: ((3,), (4,))

    c = np.meshgrid(a, b); 
    # c                              # c is a 'list', not 'numpy.array'
    Out[57]:                       # c[0]:沿行(axis=0)广播, 每一行元素跟上一行相同
    [array([[1, 2, 3],             # c[1]:沿列(axis=1)广播, 每一列元素跟上一列相同
            [1, 2, 3],             # (c[0],c[1])组成的坐标点(x,y)将覆盖并形成(1<=x<=3,-4<=y<=-1)区间组成的2*3的矩形
            [1, 2, 3],
            [1, 2, 3]]), 
    array([[-1, -1, -1],
            [-2, -2, -2],
            [-3, -3, -3],
            [-4, -4, -4]])]

    c[0].shape, c[1].shape
    Out[61]: ((4, 3), (4, 3))

    plt.pcolormesh(c[0], c[1], c=...)             
# c[0]表示点横坐标,c[1]表示纵坐标
# 对样本(c[0], c[1])周围(包括样本所在坐标)的四个坐标点进行着色,C代表着色方案
        # 点(c[0], c[1])所有坐标点如下:
        '''
            ^
            |---1------2------3---->
            |
           -1  (1,-1) (2,-1) (3,-1)
            |
           -2  (1,-2) (2,-2) (3,-2)
            |
           -3  (1,-3) (2,-3) (3,-3)
            |
           -4  (1,-4) (2,-4) (3,-4)
            |
            '''
'''
多元分类:逻辑回归分类器
sklearn.linear_model.LogisticRegression(
        solver='liblinear',
        C=正则强度)
'''

import numpy as np
import matplotlib.pyplot as plt
import sklearn.linear_model as lm

# train_set
x = np.array([
        [4, 7],
        [3.5, 8],
        [3.1, 6.2],
        [0.5, 1],
        [1, 2],
        [1.2, 1.9],
        [4, 2],
        [5.7, 1.5],
        [5.4, 2.2]])                                             # 散点[x,y]
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])                        # 多元分类 3类

# 逻辑回归分类器
model = lm.LogisticRegression(solver='liblinear', C=50)          # C
model.fit(x, y)

plt.figure('Logistic Classification', facecolor='lightgray')
plt.title('Logistic Classification', fontsize=14)
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.tick_params(labelsize=10)

'''
pcolormesh参数设置:
'''
l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005            # 左边界,右边界,水平方向点间距
b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005            # 下边界,上边界,垂直方向点间距

#print(np.arange(l, r, h).shape, np.arange(b, t, v).shape)       # (1440,) (1800,),shape不同,不能直接作为输入,转为
grid_x = np.meshgrid(np.arange(l, r, h), np.arange(b, t, v))     # (m-array,n-array)--> list(mat(m,n), mat(m,n))

print(grid_x[0])                                                 # x[i, j]  (1800, 1440) <class 'numpy.ndarray'> 
print(grid_x[1])                                                 # y[i, j]  (1800, 1440) <class 'numpy.ndarray'> 
#print(grid_x[1].shape)                                          # (1800, 1440) <class 'numpy.ndarray'>
flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()]             # 保证输入散点的坐标点横纵坐标个数一样
flat_y = model.predict(flat_x)                                   # 输入栅格点阵坐标,模型预测输出的分类
grid_y = flat_y.reshape(grid_x[0].shape)                         # 分类标签:用做pcolormesh栅格着色的依据
print(grid_y)
#[[1 1 1 ... 2 2 2]             # 0, 1, 2 分别代表三种不同颜色
# [1 1 1 ... 2 2 2]
# [1 1 1 ... 2 2 2]
# ...
# [0 0 0 ... 0 0 0]
# [0 0 0 ... 0 0 0]
# [0 0 0 ... 0 0 0]]


# pcolormesh: 伪彩图 pcolormesh(X, Y, C) 
# X,Y均为2-D array,如果为1-D 会自动广播,X和Y构成网格点阵
# X,Y对应位置元素x[i,j]和y[i,j]组成一个坐标点(x[i,j],y[i,j]),对样本周围(包括样本所在坐标)的四
#个坐标点进行着色,C代表着色方案
plt.pcolormesh(grid_x[0], grid_x[1], grid_y, cmap='gray')       # gray_r 与gray的色带相反

plt.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=60)            # 颜色映射

undefined

参考:

plt.pcolormesh绘制分类图

利用plt.pcolormesh绘制分类图

Update time: 2020-05-23

results matching ""

    No results matching ""