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

Jon*_*han 172 python matplotlib

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
>>>
Run Code Online (Sandbox Code Playgroud)

Joe*_*ton 325

@ Neil的答案是一种(完全有效!)方式,但你也可以导入之前简单地调用matplotlib.use('Agg') matplotlib.pyplot,然后继续正常.

例如

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')
Run Code Online (Sandbox Code Playgroud)

您也不必使用Agg后端.的PDF,PS,SVG,AGG,开罗,和GDK后端都可以没有的X服务器使用.但是,默认情况下只会构建Agg后端(我认为?),因此很有可能在您的特定安装中无法启用其他后端.

或者,您可以在.matplotlibrc文件中设置后端参数以自动matplotlib.pyplot使用给定的渲染器.

  • 对于它的价值,你实际上并没有两次导入matplotlib.您正在导入matplotlib,然后导入未自动导入的子模块.还有其他方法,是(例如,更改你的`.maplotlibrc`文件),这是最直接的方式. (12认同)

Nei*_*ass 21

您需要直接使用matplotlib API,而不是通过pylab接口.这里有一个很好的例子:

http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html

  • 我正在使用`ssh`和`screen`,除了`matplotlib.use('Agg')`建议,这是唯一有效的解决方案。感谢您的贡献 (2认同)
  • @ user3085931:很高兴知道我的答案对我写了五年后的人仍然有用!谢谢你让我知道。 (2认同)