在没有运行X服务器的情况下生成matplotlib图形
Matplotlib这个库似乎需要一个叫做$DISPLAY的环境变量,这意味着需要有一个正在运行的X服务器。
但是有些网络托管服务不允许你运行X服务器的会话。
那么有没有办法在没有运行X服务器的情况下,用matplotlib生成图表呢?
[username@hostname ~]$ python2.6
Python 2.6.5 (r265:79063, Nov 23 2010, 02:02:03)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/username/lib/python2.6/matplotlib-1.0.1-py2.6-linux-i686.egg/matplotlib/pyplot.py", line 270, in figure
**kwargs)
File "/home/username/lib/python2.6/matplotlib-1.0.1-py2.6-linux-i686.egg/matplotlib/backends/backend_tkagg.py", line 80, in new_figure_manager
window = Tk.Tk()
File "/usr/local/lib/python2.6/lib-tk/Tkinter.py", line 1643, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
>>>
2 个回答
22
你需要直接使用matplotlib的API,而不是通过pylab的接口。这里有一个不错的例子:
http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html
360
@Neil的回答是一种(完全有效的!)做法,但你也可以在导入 matplotlib.pyplot
之前,简单地调用 matplotlib.use('Agg')
,然后照常继续。
例如:
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10))
fig.savefig('temp.png')
你也不一定非得使用Agg这个后端。pdf、ps、svg、agg、cairo和gdk这些后端都可以在没有X服务器的情况下使用。不过,默认情况下(我想是这样?)只会构建Agg后端,所以其他后端在你安装的版本中可能没有启用。
另外,你也可以直接在你的.matplotlibrc
文件中设置后端参数,这样 matplotlib.pyplot
就会自动使用指定的渲染器。