Python 数据可视化-Matplotlib
Matplotlib 是 Python 最著名的绘图库,它提供了一整套和 MATLAB 类似的绘图函数集,十分适合编写短小的脚本程序以进行快速绘图。它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。
Matplotlib 采用面向对象的技术,所以组成图表的各元素都是对象。尽量克服这种面向对象的调用接口绘图比较烦琐,因此 matplotlib 还提供了快速绘图的 pyplot子模块,pyplot 语法与Matlab很相似。
安装与导入
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
matplotlib 包含子模块 pylab ,我们缩写方式导入它:
import numpy as np #载入numpy
import matplotlib.pyplot as plt #载入matplotlib的绘图模块pyplot
注释: Matplotlib 是一个大的工具包,其包含不少子模块。matplotlib.pyplot 是导入Matplotlib中的子模块pyplot。pylab是一个方便的模块,批量导入 matplotlib.pyplot 和 numpy。pylab已被弃用,为了避免名称空间污染强烈反对使用它,建议用pyplot。对于像我一样小白,上面两行代码就OK。
1.快速绘图
先看例子:
x = np.linspace(0,4*np.pi,100)
y = np.sin(x)
z = np.cos(x)
plt.figure(figsize=(10,8))#调用figure()创建一个Figure图表对象
#figsize参数指定Figure对象的宽度 和 高度, 单位为英寸
#dpi参数指定Figure对象的分辨率, 即每英寸所表示的像素数,默认值80
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b*",label="$cos(x)$")
plt.xlabel("X axis") # X 轴注释
plt.ylabel("Y axis") # Y 轴注释
plt.title("Matplotlib.pylab Figure") #图表标题
plt.xlim(0,12) #设置X轴的显示范園
plt.ylim(-1.5,1.5) #设置Y轴的显示范園
plt.grid() #显示网格
plt.legend() #显示各图形的标签
plt.show() #显示绘图窗口
结果:
代码有详细的注释,但下面整理以下基本语法:
plt.figure(figsize=(10,8))
用figure()创建一个Figure图表对象
figsize参数指定Figure对象的宽度 和 高度, 单位为英寸
dpi参数指定Figure对象的分辨率, 即每英寸所表示的像素数,默认值80facecolor 背景颜色。如:facecolor=“r” 为红色背景。
edgecolor边框颜色。如:edgecolor=“r” 为红色背景。
frameon是否显示边框。如:frameon=True是否显示边框。
plt.plot()
画出y = y ( x ) y=y(x)y=y(x)的平面图。
参数:
第一个参数自变量,第二个因变量,第三个颜色和线型。
label:给曲线指定一个标签,支持Latex公式 (降低画图速度)
color:指定曲线颜色。直接写英文单词或者写‘#’开头的十六进制数或者写0到1之间的三个元素都可[RGB],如(1.0,0,0)表示红色。
字符 颜色 'b'蓝色 'g'绿色 'r'红色 'c'青色 'm'品红色 'y'黄色 'k'黑色 'w'白色 marker: 格式字符,如*,o,-,1,2,…,9,^…。曲线上的点用这些字符代替。比如下面两行代码完全等效:
plt.plot(x,z,"ro",label="cos(x)") plt.plot(x,z,label="cos(x)",color="r",marker="o")linewidth:指定曲线宽度,缩写为 lw。曲线宽度可、可以正实数。
plt.xlabel(),ylabel()
分别设置 X ,Y 轴的标题文字。
plt.title()
设置标题文字。
plt.xticks(),yticks()
坐标轴刻度文本属性。如:plt.xticks(fontsize=16, color=“red”, rotation=45) 意思为 X 轴刻度字体大小16,颜色为红色,旋转45度(文本)。
plt.xlim(),ylim()
分别设置 X,Y 轴的显示范围(开始到结束点轴坐标)。
plt.grid()
设置网格绘图。
plt.legend()
显示图示。图中表示每每条曲线的标签 (label) 和样式。
plt.show()
显示绘图窗口。
plt.savefig()
保存图像。如 plt.savefig(“pic.png”,dpi=100) 以pic.png为图片名保存图片,dpi参数指定图像分辨率,默认是80。图像分辨率 x 图像宽度 = 像素
绘制多子图
subplot() 函数允许在同一图中绘制不同的东西,即多个子图。
用法:**subplot(Rows , Cols , plotNum, facecolor,edgecolor,frameon) **
绘图区域等分为 Rows 行和 Cols 列,从左到有、从上到下、从1开始进行编号。plotNum 指定当前要绘制的子区域编号。这三个参数都小于10时,中间逗号可以不写。如 subplot(2,3,2) == subplot(232)
其余参数同上面的 figure()。
x = np.arange(0, 4*np.pi, 0.1)
ysin = np.sin(x)
ycos = np.cos(x)
#建立 subplot网格
plt.subplot(2,1,1,facecolor='b')
# 绘制第一个图像
plt.plot(x, ysin,"r*")
plt.title('sin(x)')
plt.grid()
#绘制第二个图像
plt.subplot(2,1,2,facecolor='r')
plt.plot(x, ycos,"bo")
plt.title('cos(x)')
plt.grid()
plt.show()# 展示图像
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q1WB4iNz-1612182199762)(./mtplotlibsrc/Figure_2.png)]
通过 subplot() 的 facecolor 属性给每个子图设置不同的北京颜色,如下:
for idx,color in enumerate("rgbyck"):
plt.subplot(321+idx, facecolor = color)
plt.show()# 展示图像
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w22rfFZE-1612182199766)(./mtplotlibsrc/Figure_3.png)]
某个子图占据整行或整列,可以如下调用subplot
plt.subplot(221)
plt.subplot(222)
plt.subplot(212)
plt.show()# 展示图像
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YRD1asdO-1612182199803)(./mtplotlibsrc/Figure_4.png)]
subplot2grid() 进行复杂的表格布局,其调用参数如下:
subplot2grid(shape,loc,rowspan=1, colspan=1)
shape 为表示表格形状的元组
loc 为子图左上角所在的坐标(行,列)
rowspan 为子图所占据的行数,默认1
colspan 为子图所占据的列数,默认1
例子:
fig = plt.figure(figsize=(6, 6))
axl = plt.subplot2grid((3,3),(0,0),colspan=2)#3*3块(0,0)位置,占2列
ax2 = plt.subplot2grid((3,3),(0,2),rowspan=2)#3*3块(0,2)位置,占2列
ax3 = plt.subplot2grid((3,3),(1,0),rowspan=2)#3*3块(1,2)位置,占2列
ax4 = plt.subplot2grid((3,3),(2,1),colspan=2)#3*3块(2,1)位置,占2列
ax5 = plt.subplot2grid((3,3),(1,1)) #3*3块(1,1)位置,默认占1列
plt.show()# 展示图像
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWjCWFy7-1612182199811)(./mtplotlibsrc/Figure_5.png)]
利用上面的布局,可以画出三角函数图像。
import numpy as np #载入numpy
import matplotlib.pyplot as plt #载入matplotlib的绘图模块pyplot
x = np.linspace(0,4*np.pi,100)
fig = plt.figure(figsize=(6, 6))
axl = plt.subplot2grid((3,3),(0,0), colspan=2,facecolor="r")
plt.plot(x,np.sin(x),label="$sin(x)$",color="g",linewidth=1)
plt.ylim(-1.1,1.1)
plt.grid()
plt.legend()
ax2 = plt.subplot2grid((3,3),(0,2), rowspan=2,facecolor="g")
plt.plot(x,np.cos(x),label="$cos(x)$",color="c",linewidth=1)
plt.ylim(-1.1,1.1)
plt.grid()
plt.legend()
ax3 = plt.subplot2grid((3,3),(1,0), rowspan=2,facecolor="b")
plt.plot(x,np.tan(x),label="$tan(x)$",color="y",linewidth=1)
plt.ylim(-10,10)
plt.grid()
plt.legend()
ax4 = plt.subplot2grid((3,3),(2,1), colspan=2,facecolor="c")
plt.plot(x,1/(np.tan(x)+1e-5),label="$cot(x)$",color="b",linewidth=1)
plt.ylim(-10,10)
plt.grid()
plt.legend()
ax5 = plt.subplot2grid((3,3),(1,1),facecolor="k")
plt.plot(x,1/(np.sin(x)+1e-5),label="$sec(x)$",color="r",linewidth=1)
plt.ylim(-10,10)
plt.grid()
plt.legend()
plt.show()# 展示图像
结果:
下一篇文章关于常用图像的画法。欢迎关注+留言
知乎:登日团队CEO