matplotlib的backend浅析
在服务器使用matplotlib
的时候,可能是因为没有装图形化和显示相关的包的原因,总是会出现backend
相关的错误。所以我调查了下matplotlib中的backend的含义,以及如何处理相关的错误。
matplotlib中的backend
matplotlib中,frontend就是我们写的python代码,而backend就是负责显示我们代码所写图形的底层代码。因为不同使用环境下硬件情况不同,所以后端是跟具体的硬件和显示条件相关的。
backend的类别
backend又分为两类,一类是interface backend
,又叫做interactive backend
,这一类是表示跟显示到屏幕相关的后端;另一类是hardcopy backend
,又叫做non-interactive backend
,这一类是写入到文件相关的后端。下面两图分别是non-interactive backend和interactive backend的具体值:
在python中,可以通过如下的命令来获取当前机器支持的这两种后端:
1 | import matplotlib |
在我们实验室的GPU服务器上,得到的结果如下:
设置backend
有4种方式可以来设置matplotlib的backend,而且下列越后面的设置方式,优先级越高,也就是后面的设置会覆盖前面的设置。
1. 通过设置matplotlibrc
的配置文件来设置
注意matplotlibrc
文件不一定在你的家目录下,可以通过如下命令来获取其存放位置:
1 | import matplotlib |
得到配置文件路径后,打开这个文件,写入如下一行来设置backend:
1 | backend : WXAgg # use wxpython with antigrain (agg) rendering |
其中WXAgg
可以换成任意的你的系统支持的backend类型。
注意:在backend的名字中是不区分大小写的,所以Qt4Agg
和qt4agg
是等价的。
2. 通过MPLBACKEND
环境变量来设置backend
下面两种方式都可以:
1 | ## 方式1. 先export MPLBACKEND在执行python文件 |
3. 通过-d
选项来设置
使用方法如下:
1 | $ python script.py -dbackend |
因为这种方式很容易和脚本内部的参数解析冲突,所以不建议使用这种方式,而是通过MPLBACKEND
参数的方式2来设置。
4. 通过matplotlib.use()
函数来设置
使用方式如下:
1 | import matplotlib as mpl |
再次提醒下,注意这4种方式的优先级:4>3>2>1,后面的设置会覆盖前面的设置。
解决问题
1. GPU集群执行import matplotlib.pyplot as plt
的错误
错误信息可能如下:
1 | ** (test_net_multi.py:23890): WARNING **: Could not open X display |
这是因为服务器没有装显示相关的包,可以通过在上述第2种方式来设置MPLBACKEN='Agg'
即可解决这个问题,因为Agg是non-interactive backend,所以不会要求显示图片,所以也不会再报错了。举个例子,如果你的TorqueServer的配置文件如下:
1 | #PBS -N v_test_60k |
在python执行那行行首,增加MPLBACKEND=Agg
,即改为如下内容:
1 | #PBS -N v_test_60k |
2. GPU服务器上使用matplotlib显示图片
由于服务器没有安装图形化显示界面,所以使用默认的matplotlib设置会有一些问题,图片没法正常显示。解决方法是在python文件中增加如下两行:
1 | import matplotlib as mpl |
在Jupyter notebook和VNC连过去后,这种设置都可以正确地显示图片。
注意,这两行必须在import matplotlib.pyplot as plt
之前插入,否则在plt引入后,上面的设置就没有效果了。
至于为什么是Qt4Agg
,我是一个个后端一一试出来的,应该跟服务器安装的显示包有关系,但是我暂时还没弄懂该如何查看。