简单来说,Matplotlib 是 Python 中的一个绘图库,包含了大量的工具,几乎可以通过该工具完成你所需要的任何图形,包括散点图、正弦曲线,甚至是三维图形。
这一工具经常用在数据可视化中,这里简单介绍其使用方法。
简介
在正式使用之前,强烈建议先查看下官方的 示例库 ,包含了样例以及对应的代码,几乎包含了所能想到的图形。
常用函数
plt.figure() 定义一个图像
figsize=(3, 1) 图片的宽、高设置,单位为英寸(1英寸=2.54厘米)
plt.plot() 绘制图形
plt.axhline() 绘制水平线
plt.imshow() 根据像素绘制图片
plt.legend() 显示图例
plt.title() 标题
plt.xlabel() X轴标记
plt.ylabel() Y轴标记
subplot
subplot(nrows, ncols, index, **kwargs)
用来将一个图分割成多个,前三个参数分别用来指定行、列、当前使用序号,
subplot(2, 2, 1) # 创建两行两列,并使用第一个(第一行+第一列)
subplot(221) # 等价于上面的函数,是简写
如果在一个图中绘制出的图片比较混乱,可以将图片分割成多个,通过 subplot()
进行分割,并标示序号 (从1开始向右) 。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0.0, 5.0, num=100)
y1 = np.sin(np.pi * x)
y2 = np.cos(np.pi * x)
y3 = np.cos(np.pi * x * 2)
#plt.plot(x, y1, 'b--', label='$sin(\pi * x)$')
#plt.plot(x, y2, 'r--', label='$cos(\pi * x)$')
#plt.plot(x, y3, 'g--', label='$cos(\pi * x * 2)$')
plt.subplot(211)
plt.plot(x, y3, 'g--', label='$cos(\pi * x * 2)$')
plt.legend(loc='lower right')
plt.subplot(223)
plt.plot(x, y1, 'b--', label='$sin(\pi * x)$')
plt.legend(loc='lower right')
plt.subplot(224)
plt.plot(x, y2, 'r--', label='$cos(\pi * x)$')
plt.legend(loc='lower right')
plt.show()
上述的绘图实际上是在默认的窗口中,也可以通过 fig = plt.figure()
新建一个窗口,然后通过 ax = fig.add_subplot(221)
进行添加。
imshow
import numpy as np
import matplotlib.pyplot as plt
p = np.linspace(-5, 5, num=1000)
xs, ys = np.meshgrid(p, p)
z = np.sqrt(xs ** 2 + ys ** 2)
# 可以选择cool hot
plt.imshow(z, cmap=plt.cm.gray)
plt.show()
可以坐标为 0~1000
,也就是传入的 z 矩阵对应的是 1000x1000
,z 的索引是图像的坐标,而其值是通过图的颜色显示出来的。
另外,imshow()
函数还提供了图形插值方式,对于没有的数据可以通过插值的方式进行填充。
import numpy as np
import matplotlib.pyplot as plt
data = np.add.outer(range(8), range(8)) % 2
plt.imshow(data, cmap=plt.cm.gray, interpolation='nearest', origin="lower")
plt.show()
其它的插值算法还有 bilinear
bicubic
等。
动画
最简单的,可以通过如下方式生成动画,但是暂时不太确定如何进行保存。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 20, 500)
plt.figure(figsize=(8, 4))
for i in range(100):
plt.clf()
y = np.sin(x + np.pi * 0.1 * i)
plt.plot(x, y, color='blue', linewidth=1)
plt.pause(0.05)
另外,也可以使用 Matplotlib 库中的 animation 模块,如下是一个简单的示例。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig, ax = plt.subplots()
x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))
def init():
line.set_ydata([np.nan] * len(x))
return line,
def animate(i):
line.set_ydata(np.sin(x + i / 100)) # update the data.
return line,
ani = animation.FuncAnimation(fig, animate, init_func=init,
interval=2, blit=True, save_count=50)
# To save the animation, use e.g.
# ani.save("movie.mp4")
# ani.save('animation.gif', writer='pillow')
# ani.save('animation.html', writer='html')
# or
# from matplotlib.animation import FFMpegWriter
# writer = FFMpegWriter(fps=15, metadata=dict(artist='Me'), bitrate=1800)
# ani.save("movie.mp4", writer=writer)
plt.show()
参数
rcParams
通过该参数可以设置图片大小、颜色、像素、分辨率等参数信息。
详细可以参考 The top level matplotlib module 中的介绍。
FAQ
常见报错
ImportError: No module named _tkinter
默认 Python 安装包没有提供这个库,需要安装 tkinter
包,直接 yum install tkinter
即可,据说源码编译时,需要确保添加了 --enable-unicode=ucs2
参数。
另外,还需要通过安装 python-tools
或者 python3X-tools
。
Found existing installation: pyparsing 1.5.6
安装 matplotlib
包时,会依赖上述的包,主要是版本问题,可以从 pypi.org/pyparsing 上查看最新的包,例如是 2.2.0
,那么可以通过如下方式安装。
# pip install -I pyparsing==2.2.0
UserWarning: Matplotlib is currently using agg…
完整的报错为 UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
,主要是此时默认的后端是 agg
导致,可以通过如下命令确认。
>>> import matplotlib
>>> matplotlib.get_backend()
'agg'
最简单的,将 plg.show()
替换为 fig.savefig()
,也就是直接保存为图片,而非通过窗口显示。另外,也可以通过 matplotlib.use('TkAgg')
设置后端。