matplotlib散点图绘制
绘制散点图的基本操作:
- 绘制窗口
plt.figure(figsize=(10,8))
- 创建x、y的数据列表
- 规定x、y、图片的标题
plt.title('knn图例', fontsize=20) plt.xlabel('x-value') plt.ylabel('y-label')
- 制定散点图画图的其他细节
- 显示
plt.show()
其中,制定散点图画图的其他细节这一步,根据需求有许多精彩的操作。
针对不同数据绘制不同的颜色及图案
方法一:
将每个数据的颜色要求,分别放入列表中,并将此列表作为颜色参数。
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算法需要将邻近范围圈出来,则需要以测试数据为圆心,与选入参考的最远测试数据的距离为半径,画圆。
效果如图:
画圆利用画线的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