系列文章目录
Python 机器学习入门之Matplotlib的使用
文章目录
目录
[系列文章目录Python 机器学习入门之Matplotlib的使用](#系列文章目录Python 机器学习入门之Matplotlib的使用)
[1.1 导引](#1.1 导引)
[1.1.1 plot() 使用展开](#1.1.1 plot() 使用展开)
[1.2 在全局的区域内创建一个子区域,实现一个绘图区域内绘制两张图片](#1.2 在全局的区域内创建一个子区域,实现一个绘图区域内绘制两张图片)
[1.3 坐标汉化](#1.3 坐标汉化)
[1.4 坐标图形中文本的显示](#1.4 坐标图形中文本的显示)
[2.1 plt.pie()饼状图的绘制](#2.1 plt.pie()饼状图的绘制)
[2.2 plt.hist()直方图的绘制](#2.2 plt.hist()直方图的绘制)
一、导引
Matplotlib库由各种可视化的类组成,matplotlib.pyplot是绘制各类可视化图形的命令子库 ,相当于快捷方式,通常使用方式:(plt为引入块的别名)
pythonimport matplotlib.pyplot as plt
二、图形的绘制
常用的 pyplot函数:
plot()
:用于绘制线图和散点图scatter()
:用于绘制散点图bar()
:用于绘制垂直条形图和水平条形图hist()
:用于绘制直方图pie()
:用于绘制饼图imshow()
:用于绘制图像subplots()
:用于创建子图除了这些基本的函数,pyplot 还提供了很多其他的函数,例如用于设置图表属性的函数、用于添加文本和注释的函数、用于保存图表到文件的函数等等。
1.plot库的使用
1.1 导引
pythonimport matplotlib.pyplot as plt plt.ylabel("grade") #y轴的标签 #将生成的.png图片保存到test文件当中,dpi=600表示一英寸中包含600像素点 plt.savefig('test',dpi=600) plt.plot([3,1,4,5,2]) #y轴的数据点 plt.show()
这里需要说明:当plot()中只给一维时,给到的其实是y轴的值,x轴的值是自动生成的。
pythonimport matplotlib.pyplot as plt plt.plot([0,2,4,6,8],[3,1,4,5,2]) plt.ylabel("Grade") # y轴的标签 plt.xlabel("Sore") # x轴的标签 plt.axis([-1,10,0,6]) # 可以设置 x轴和y轴的起止长度 plt.show()
当plot()中给二维时,第一个"列表"表示的是图像中x轴的坐标,另一个表示的才是y轴的值。
那再创建一维列表是不是就能画出三维的图形了呢?答案是不行的。
直接使用 plt.plot() 函数无法绘制三维图像。plt.plot() 是 matplotlib 的二维绘图函数,即使传入三个数组,它也无法自动创建三维坐标系。
python# 画单条线 plot([x], y, [fmt], *, data=None, **kwargs) # 画多条线 plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
正确创建3维图形:(跑题了...)
pythonimport matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 导入3D工具包 # 创建图形和3D坐标轴 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 关键:创建3D坐标轴 # 使用3D坐标轴的plot方法绘制三维线图 ax.plot([0,2,4,6,8], [3,1,4,5,2], [1,2,3,4,5]) # 设置坐标轴标签(注意三维有三个轴) ax.set_xlabel("X Label") ax.set_ylabel("Y Label") ax.set_zlabel("Z Label") # 设置坐标轴范围(三维需要分别设置) ax.set_xlim([-1, 10]) ax.set_ylim([0, 6]) ax.set_zlim([0, 6]) plt.show()
1.1.1 plot() 使用展开
python# 画单条线 plot([x], y, [fmt], *, data=None, **kwargs) # 画多条线 plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
- x, y:点或线的节点,x 为 x 轴数据,y 为 y 轴数据,数据可以列表或数组。
- fmt:可选,定义基本格式(如颜色、标记和线条样式)。
- **kwargs:可选,第二组或更多。 (至此我们知道上面我们加的第三个列表其实是同一个坐标系内的第二组图像,当有多条曲线的时候x不能省略)
颜色字符:'b' 蓝色,'m' 洋红色,'g' 绿色,'y' 黄色,'r' 红色,'k' 黑色,'w' 白色,'c' 青绿色,'#008000' RGB 颜色符串。多条曲线不指定颜色时,会自动选择不同颜色。
线型参数:'‐' 实线,'‐‐' 破折线,'‐.' 点划线,':' 虚线。
标记字符:'.' 点标记,',' 像素标记(极小点),'o' 实心圈标记,'v' 倒三角标记,'^' 上三角标记,'>' 右三角标记,'<' 左三角标记...等。(图中每个点如何进行标记)
pythonimport matplotlib.pyplot as plt a=np.arange(10) plt.plot(a,a*1.5,'go-',a,a*2,'r*',a,a*3,'1',a,a*4,'b-.') plt.show()
1.2 在全局的区域内创建一个子区域,实现一个绘图区域内绘制两张图片
pythonplt.subplot(nrows,ncols,plot_number) #下面两行的表示是相同的,在这个函数下面绘制的图形都会在这个区域内 plt.subplot(3,2,4) # plt.subplot(324) #
来说明一下原理 :nrows表示用横线将区域分为上中下三个部分,ncols表示用纵线将区域分为左右两个部分,而plot_number用于表示当前的绘图区域。
如果我们想要自定义我们所选部分的区域大小又怎样实现呢?这里我们就引入了 plt.subplot2grid()
我们来仔细解释一下这个调用内的一些参数:GridSpace:表示要将区域划分为多少个小部分,(3,3)表示将区域平均划分为横纵都为3共九个部分;CurSpec:表示当前所在区域;colspan=2:表示将当前区域沿着横坐标延长为2(此时这一部分就变为了原区域部分的两倍即图中黄色部分)同理rowspan则用来表示纵向所占的区域长度。
上面引入一种专门表示区域的一个包,下标从0开始。简单说一下gs[1,:-1] 即选中区域在第二行,列则从起始开始到最后一列(不包含最后一列)
1.3 坐标汉化
pythonimport matplotlib import numpy as np import matplotlib.pyplot as plt matplotlib.rcParams['font.family']='SimHei' # 黑体 matplotlib.rcParams['font.size']=20 # 字体大小,这里将其应用到全局 a=np.arange(0.0,5.0,0.02) plt.xlabel('时间') plt.ylabel('振幅') plt.plot(a,np.cos(2*np.pi*a),'r--') plt.show()
如果上面使用黑体,又会出现一个新的问题:负号不能正常显示。原因是:Matplotlib默认使用
U+2212
作为负号,但某些字体可能不支持这个字符。这里说几个解决方案:第一就是不用黑体采用华文宋体等;第二就是将它强制转为ASCII负号(具体可查阅资料);第三就是采用回退机制(同时指定多种字体,如果第一种不支持就采用第二种)。下面是采用华文仿宋后的效果。(左侧图形)但是大多数情况我们是希望我们对字体属性的改变只发生在局部作用域, fontproperties就可以实现这一点。
pythonimport matplotlib import numpy as np import matplotlib.pyplot as plt matplotlib.rcParams['font.family']='STSong' matplotlib.rcParams['font.size']=20 a=np.arange(0.0,5.0,0.02) plt.xlabel('时间',fontproperties='SimHei',fontsize=20) plt.ylabel('振幅',fontproperties='SimHei',fontsize=20) plt.plot(a,np.cos(2*np.pi*a),'r--') plt.show()
1.4 坐标图形中文本的显示
pythonimport matplotlib import numpy as np import matplotlib.pyplot as plt a=np.arange(0.0,5.0,0.02) plt.xlabel('时间',fontproperties='SimHei',fontsize=20) #x,y轴的标签 plt.ylabel('振幅',fontproperties='SimHei',fontsize=20) plt.plot(a,np.cos(2*np.pi*a),'r--') plt.title(r'正弦波 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=30) # 图形的主题 plt.annotate(r'$\mu=100$',xy=(2.02,1.02),xytext=(3,1.5),arrowprops=dict(facecolor='black',shrink=1,width=2)) #xy表示箭头的起始点,xytext表示文本的起始点,arrowprops:对箭头的属性定义 # plt.text(2,1,r'$\mu=100$',fontsize=15) plt.axis([0,5,-1.5,2]) plt.grid(1) # plt.xticks(np.arange(0, 5.1, 0.5)) # 从0到5,每0.5一个刻度 # plt.yticks(np.arange(-1, 1.1, 0.25)) # 从-1到1,每0.2一个刻度 plt.show()
其中shrink表示箭头的长度,width表示箭头的宽度。
2.其他图形绘制
2.1 plt.pie()饼状图的绘制
pythonimport matplotlib.pyplot as plt labels='Frogs','Hogs','Dogs','Logs' #饼状图标签 sizes=[15,30,45,10] #所占百分比 explode=(0,0.1,0,0) # 指定部分脱离饼状中心多少,0.1表示脱离10% plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=0,startangle=90) plt.axis('equal') plt.show()
autopct:表示百分比的书写形式,shadow=0:表示没有阴影。
2.2 plt.hist()直方图的绘制
pythonnp.random.seed(0) #随机数种子保证了代码的可重现性 mu,sigma=100,20 #均值,方差 a=np.random.normal(mu,sigma,size=100) #生成一个随机分布的正态分布图 plt.hist(a,15,histtype='stepfilled',facecolor='b',alpha=0.75) plt.title('Histogram') plt.show()
注意:size=100表示要生成的随机数数量为100,bin=15表示直方图中柱子的数量。
三、总结
本文主要参考嵩天老师的相关课程并做梳理,主要介绍了折线图,饼状图,直方图这些常用的图形,事实上Matplotlib下pyplot库中可绘制的图形远不止这些,如果想做进一步了解资料有很多这里不过多赘述,如果感觉有收获那就点个赞吧!