博文链接:

matplotlib.use(‘agg‘)“语句的作用机理

matplotlib中什么是后端

问题:在检查SSD代码时,在callback.py文件中发现出现了matplotlib.use('agg')的语句。PyCharm中不显示绘图。

相关示例:

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt # matplotlib.use('agg')必须在本句执行前运行
x = np.arange(0, 2*np.pi, 0.001)
y = np.sin(2 * np.pi * x)
plt.clf()
plt.plot(x,y)
l = plt.axhline(linewidth=1, color='black')
l = plt.axvline(linewidth=1, color='black')
plt.show()

原理分析:

实际上,这样的理解是表面的,这个语句确实会使得在Pycharm运行时无法显示图,但是必须注意,这是其原理导致的,而这个语句并不是设置Pycharm不显示图的语句,其实前述的代码中,删掉 plt.show(),也不会显示图片。

matplotlibuse()命令其实是用来配置matplotlibbackend(后端)的命令。所谓后端,就是一个渲染器,用于将前端代码渲染成我们想要的图像。后端详细的解释可参考博客:matplotlib中什么是后端

对于用户接口,典型的渲染器是Agg,它是使用Anti-Grain Geometry C++库来产生光栅(像素)图。

那么为什么这样设置Pycharm会导致其不显示图片呢?

可以查看一下目前的后端设置。方法是执行下面代码。

1
2
3
>>> import matplotlib
>>> matplotlib.get_backend()
Qt5Agg

也就是说,Pycharm运行的时候,默认的后端是Qt5Agg

实际上,Agg 渲染器是非交互式的后端,没有GUI界面,所以不显示图片,它是用来生成图像文件。Qt5Agg 是意思是Agg渲染器输出到Qt5绘图面板,它是交互式的后端,拥有在屏幕上展示的能力