绘图而不显示:正确使用matplotlib.use()

时间:2017-10-04 09:52:17

标签: python matplotlib

我需要在一个没有显示器的系统上进行绘图。 如果我使用matplotlib.pyplot.plt天真地绘制,我得到

    raise RuntimeError('Invalid DISPLAY variable')

我发现matplotlib.use()可以在这种情况下使用。 现在我有一个主文件:

 **main.py:**

 import my_module
 ....
 # do stuff

 **my_module.py:**

 import matplotlib
 matplotlib.use('Agg') # Must be before importing matplotlib.pyplot or     pylab!
 import matplotlib.pyplot as plt    
 # do stuff
 plt.plot(data)

运行main.py时,我得到:

UserWarning: 
This call to matplotlib.use() has no effect because the backend has already
been chosen; matplotlib.use() must be called *before* pylab,     matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

但对我而言,我似乎是在导入pyplot之前调用它。后来我收到了这个运行时错误

File "[OMIT]/python2.7/site-packages/matplotlib    /backends/backend_qt5.py", line 144, in _create_qApp
raise RuntimeError('Invalid DISPLAY variable')
RuntimeError: Invalid DISPLAY variable

那么改变matplotlib后端的正确方法是什么?我不需要显示,但我需要能够使用plt.savefig存储数据

2 个答案:

答案 0 :(得分:1)

你需要

import matplotlib
matplotlib.use('Agg')

在新内核上,特别是如果您使用ipython,在导入matplotlib.pyplot之前

我很好奇,并且很高兴知道是否有办法清除/刷新ipython内核,而不必重新启动它;到目前为止,我的任务还没有成功。

答案 1 :(得分:1)

最后,我解决了:

**main.py***
import matplotlib
matplotlib.use('Agg') # Must be before importing matplotlib.pyplot or pylab!
import my_module

因为my_module中的许多子导入无法确定首次导入pyplot的位置。 我也做了:

import my_module

而不是我做得更早。

from my_module import my_func