最近在看《机器学习实战》这本书,用书中的代码画散点图时遇到了一些小问题,查了很多人的文章最后成功画出想要的图形,这里写下过程当做笔记,也给同样遇到问题的同学提供参考。
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
导入数据
import kNN
datingDateMat,datingLabels = kNN.file2matrix("datingTestSet2.txt")
fig = plt.figure()
add_subplot是画子图函数,add_subplot(a, b, c)表示将画布分成a行b列,图像画在从左往右,从上往下的##第c块
ax = fig.add_subplot(111)
普通的散点图
ax.scatter(datingDateMat[:,1], datingDateMat[:,2])
plt.show()
这个散点图使用datingDataMat矩阵的第二、第三列数据,分别表示特征值“玩视频游戏所耗时间百分比”和“每周所消费的冰淇淋公升数”。由于样本没有样本分类的特征值,上图很难看到任何有用的数据模式信息。调用scatter()函数色彩和尺寸参数,scatter(x, y, s = 1, c= ‘g’, marker = ‘s’, linewidths = 0):s代表散点的大小,c代表点的颜色,marker##代表形状,linewidths代表边框宽度,重新画图用如下代码:
ax.scatter(datingDataMat[:,1], datingDataMat[:,2],
s =20*np.array(datingLabels), c =15*np.array(datingLabels) )
上图利用颜色及尺寸标识了数据点的属性类别,基本可以看出数据点所属三个列表分类的区域轮廓,但使用datingdataMat矩阵的第一列和第二列属性可以得到更好的展示效果,下面展示这个图形,并通过这个例子讲解如何给散点图添加图例,坐标轴标签,标题等。
plt.figure()
为了添加图例,将三种类别图形数据区分开
type1_x = []
type1_y = []
type2_x = []
type2_y = []
type3_x = []
type3_y = []
用for循环给上面列表填充相应数据
for i in range(len(datingLabels)):
if datingLabels[i] == 1:
type1_x.append(datingDataMat[i][0])
type1_y.append(datingDataMat[i][1])
if datingLabels[i] == 2:
type2_x.append(datingDataMat[i][0])
type2_y.append(datingDataMat[i][1])
if datingLabels[i] == 3:
type3_x.append(datingDataMat[i][0])
type3_y.append(datingDataMat[i][1])
有了数据之后将三类数据依次添加到figure中
plt.scatter(type1_x, type1_y, s = 20, c = 'r', label = u'不喜欢')
plt.scatter(type2_x, type2_y, s = 40, c = 'r', label = u'魅力一般')
plt.scatter(type3_x, type3_y, s = 60, c = 'r', label = u'极具魅力')
添加x.y轴标签
plt.xlabel(u'每年获得的飞行常客里程数')
plt.ylabel(u'玩视频游戏所耗时间百分比')
添加标题
plt.title('figure 3')
添加图例
plt.legend()
plt.show()
这样一张带标题、坐标轴标签以及图例的散点图就画好啦!