在没有运行X服务器的情况下生成matplotlib图形

194

Matplotlib似乎需要$ DISPLAY环境变量,这意味着需要运行X服务器。
一些Web托管服务不允许运行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个回答

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 自动使用给定的渲染器。

对我来说,你需要两次导入matplotlib似乎有些疯狂。有更简单的方法吗? - tommy.carstensen
14
就此问题而言,实际上你并没有重复导入matplotlib库。你是在导入matplotlib库后,再导入一个未被自动导入的子模块。当然还有其他方法(比如更改.maplotlibrc文件),但这种方法是最简单直接的。 - Joe Kington
它指出:“必须在第一次导入pylab、matplotlib.pyplot或matplotlib.backends之前调用matplotlib.use()。” - xb.
你提到的大多数后端(具体来说:pdf、ps、svg、agg)都是非GUI后端,因此它们不允许直接从代码中显示绘图。 - Erel Segal-Halevi
更具体地说,对于后一种选择,在Linux下,您只需要将“backend:Agg”保存在文件“.config/matplotlib/matplotlibrc”中。 - nspo
显示剩余3条评论

22

3
我正在使用 sshscreen,除了 matplotlib.use('Agg') 的建议外,这是唯一有效的解决方案。感谢您的贡献。 - user3085931
2
@user3085931:很高兴知道我写下的答案在5年后仍然对某人有用!感谢您让我知道。 - Neil Vass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接