Python 数据可视化-Matplotlib(基础详解)

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对象的分辨率, 即每英寸所表示的像素数,默认值80

    facecolor 背景颜色。如: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


版权声明:本文为SalamAbdu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。