在上一篇中,我们介绍了Matplotlib的面积图、填充图和饼图的基本概念及用法。今天我们来看一下散点图,然后讲一下在Matplotlib图表中使用中文的方法。
散点图是一种在回归分析中,数据点在直角坐标系平面上的分布图。散点图表示因变量随自变量变化的大致趋势,据此可以选择合适的函数对数据点进行拟合。散点图通常用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。散点图将序列显示为一组点,值由点在图表中的位置表示,类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据。Matplotlib中,散点图使用scatter()方法创建。
scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,*,data=None,**kwargs)各常用参数意义如下。
x, y:绘制散点图的数据点。
s:可选参数。散点的大小,为一个实数或数组。默认大小为20。
c:可选参数。散点图的颜色序列。这里要注意c不是一个单一的RGB或RGBA序列,而是一个RGB或RGBA的二维数组。
marker:可选参数。散点图的散点样式,可选样式可参考之前介绍Matplotlib属性时的相关内容。
cmap:可选参数。颜色映射实例或注册的颜色映射名称。只有当c是一个浮点数组时,才使用cmap。
norm:可选参数。若为True,则将数据正则化为0-1之间的数。
vmin, vmax:可选参数。数据边界化,但是若norm已设置为True,则参数无效。
alpha:可选参数。设置散点透明度。
linewidths:可选参数。标记点的长度。
edgecolors:可选参数。颜色或颜色序列,标记边缘颜色。
绘制散点图用法如下。
# 0、导入包import matplotlib.pyplot as pltimport numpy as npimport pandas as pd# 1、准备数据x = np.random.randn(1000)y = np.random.randn(1000)# 2、创建图像fig = plt.figure(figsize=(4, 4), facecolor=(0, 1, 0, 1))# 3、绘图ax = fig.add_subplot(111)ax.scatter(x, y, marker='.')# 4、自定义设置ax.set_title("scatter")# 5、保存图形(按需要使用)# plt.savefig(‘xxx.png’)# 6、显示图形plt.show()
上述代码绘制了一个简答的散点图,运行结果如下图所示。
通过修改属性参数,可以绘制各种样式的散点图。
# 0、导入包import matplotlib.pyplot as pltimport numpy as npimport pandas as pd# 1、准备数据x = np.random.randn(200)y = np.random.randn(200)# 2、创建图像fig, axes = plt.subplots(2, 2, figsize=(6, 6), facecolor=(0, 1, 0, 1))# 3、绘图ax1 = axes[0, 0]ax1.scatter(x, y, marker='.', s=10)ax2 = axes[0, 1]ax2.scatter(x, y, marker='.', s=60, c=x, alpha=0.8)ax3 = axes[1, 0]ax3.scatter(x, y, marker='^', c=x)ax4 = axes[1, 1]ax4.scatter(x, y, marker='.', s=np.random.randn(1000)*100, c=x, edgecolors=(1, 0, 0, 1))# 4、自定义设置ax1.set_title("scatter1")ax2.set_title("scatter2")ax3.set_title("scatter3")ax4.set_title("scatter4")# 5、保存图形(按需要使用)# plt.savefig(‘xxx.png’)# 6、显示图形plt.show()
上述代码绘制了4个散点图。图1设置散点的大小s=10小于默认值;图2设置散点的大小s=60大于默认值,同时将numpy数组x作为颜色数组传入c,并设置透明度alpha=0.8;图3设置散点的样式为三角形;图4将s将散点的大小s设置成随机数数组,同时设置散点的边颜色edgecolors。运行效果如下图所示,通过对比可以看出设置的属性之间的差异。
有时我们会需要考察多个变量之间的相关关系,我们可以使用散点图矩阵。由于Matplotlib中没有介绍到散点图矩阵,我们借用pandas来实现,另一个绘制图表库seaborn中有专门的绘制散点图矩阵的方法,如果有机会介绍我们再详细展开。pandas中通过scatter_matrix()方法实现散点图矩阵。scatter_matrix()方法接收数据,主要参数为diagonal,这个参数只能传hist或kde两种值,hist为直方图表示方式,kde为密度图表示方式,此外还可传marker, alpha等相关属性参数。基本用法如下。
# 导入包import numpy as npimport pandas as pd# 准备数据data = pd.DataFrame(np.random.randn(200, 3), columns=list('abc'))# 绘制图表pd.plotting.scatter_matrix(data, marker='.', diagonal='hist') # diagonal还可以传kde,只能二选一
我们以hist直方图表示方式为例,运行结果如下。
在Matplotlib的使用中,如果给图表添加中文,我们会发现出现了乱码。我们给图表标题设置一个中文名称。
# 0、导入包import matplotlib.pyplot as pltimport numpy as npimport pandas as pd# 1、准备数据x = np.random.randn(1000)y = np.random.randn(1000)# 2、创建图像fig = plt.figure(figsize=(5, 5), facecolor=(0, 1, 0, 1))# 3、绘图ax = fig.add_subplot(111)ax.scatter(x, y, marker='.', s=np.random.randn(1000)*100, c=y, alpha=0.8)# 4、自定义设置ax.set_title("散点图")# 5、保存图形(按需要使用)# plt.savefig(‘xxx.png’)# 6、显示图形plt.show()
运行后发现中文无法正常显示,所有中文都变成了一个个的小框框。
下面给出解决方法。
1、找到matplotlibrc文件所在路径,可以通过使用matplotlib的matplotlib_fname方法获取。
import matplotlib as mplprint(mpl.matplotlib_fname())
进入matplotlibrc所在目录,可以看到该目录下有如下内容。
2、下载中文字体包,这里我们用简体中文字体包(SimHei.ttf),可以用下面给出的下载链接进行下载。将下载好的字体包放入上述目录的fonts文件夹下。
3、打开matplotlibrc文件,全局搜索找到font.family、font.sans-serif两个地方,然后去掉注释,即前面的“#”,并在font.sans-serif后面添加我们要加入的字体,这里我们添加SimHei。再全局搜索找到axes.unicode_minus,去掉注释,并将True改成False,最后保存退出。
4、清除缓存。mac用户直接在“/User/当前用户名”下,Windows用户在“C:/用户/当前用户名”下,找到.matplotlib文件夹,直接删除它即可。
5、如果使用Jupyter,需要先重启。然后再重新运行代码,即可正常显示出中文,效果如下。
下次我们继续介绍其他类型的图表。