matplotlib散点图绘制

绘制散点图的基本操作:

  1. 绘制窗口
    plt.figure(figsize=(10,8))
  2. 创建x、y的数据列表
  3. 规定x、y、图片的标题
    plt.title('knn图例', fontsize=20)
    plt.xlabel('x-value')
    plt.ylabel('y-label')
  4. 制定散点图画图的其他细节
  5. 显示
    plt.show()

参考file:///C:/Users/ThinkPad/AppData/Local/Packages/microsoft.microsoftedge_8wekyb3d8bbwe/AC/#!001/MicrosoftEdge/User/Default/WebNotes/Microsoft-Edge-Web-Notes-Python可视化.html

其中,制定散点图画图的其他细节这一步,根据需求有许多精彩的操作。

针对不同数据绘制不同的颜色及图案

方法一:

将每个数据的颜色要求,分别放入列表中,并将此列表作为颜色参数。

color = []
for i in x_data:
    type =  label[i[0]]
    if type=='A':
        color.append('g')
    else:
        color.append('r')
plt.scatter(x_list , y_list , c=color , marker='o')

方法二:

多次使用scatter函数,对数据进行设置。

接上例,有某个数据想要绘制三角形。此时若为了这单个数据,对所有数据再创建符号列表marker_list,操作过于赘述。

可以考虑再次调用scatter函数,对这单个数据进行设置。

plt.scatter(x_list , y_list , c=color , marker='o')#训练数据
plt.scatter(test[0],test[1],c='y',marker='^')#单个测试数据test
plt.show()

图例

由函数legend()实现。

方法一:

在每一个scatter后面设置label的值

plt.scatter(x_A , y_A , c='g' , marker='o',label='A类训练数据')
plt.scatter(x_B , y_B , c='r', marker='o',label='B类训练数据')
plt.scatter(test[0],test[1],c=color,marker='^',label='测试数据')
plt.legend()
plt.show()

方法二:

在legend()的参数为label对应的数组

plt.scatter(train_x, train_y_1, c='red', marker='v' )

plt.scatter(train_x, train_y_2, c='blue', marker='o' )

plt.legend(["red","Blue"])plt.show()
参考:https://blog.****.net/weixin_41950276/article/details/84259546


画圆

knn算法需要将邻近范围圈出来,则需要以测试数据为圆心,与选入参考的最远测试数据的距离为半径,画圆。

效果如图:

 

matplotlib散点图绘制

画圆利用画线的plot函数实现,只要将x设为自变量,y设为因变量即可。

有好几种方法表示圆,在这里采用标准方程表示x与y的关系。其他表示方法参考:https://www.cnblogs.com/yibeimingyue/p/9916048.html

画圆部分的代码:

r=farest[1]#半径
a,b=test[0],test[1]#圆心的坐标
x = np.arange(a-r, a+r, 0.00001)#创建x轴绘图点的等差列表
y1 = b + np.sqrt(r**2 - (x - a)**2)#圆的上半部分
y2 = b - np.sqrt(r**2 - (x - a)**2)#圆的下半部分

fig = plt.figure()
axes = fig.add_subplot(111)#将画布分割成1行1列,图像画在第1块
axes.plot(x, y1,color='y',linestyle='-',label='k='+str(n_neighbors))# 上半部
axes.plot(x, y2,color='y',linestyle='-') # 下半部

axes.axis('equal')#横纵坐标轴的最小刻度一致(为了画圆,若不设置则为椭圆)

关于figure,subplot,plot,axes,axis的更多讨论,阅读:https://blog.****.net/JasonZhu_****/article/details/85860963

待完善:

1.绘图加载的字体无法显示坐标负数

2.关于画图部分未封装,写的过于凌乱,继承性不高

3.Knn算法的k值是手工设定的。可以考虑先决定K的值是多少,要选出最优的K值,可以使用sklearn中的交叉验证方法。

参考:https://zhuanlan.zhihu.com/p/61996479