2011-02-08 3 views
143

Для Matplotlib требуется переменная среды $ DISPLAY, что означает работающий X-сервер.
Некоторые услуги веб-хостинга не позволяют выполнять сеанс X-сервера.
Есть ли способ генерировать графики с использованием matplotlib без запуска X-сервера?Создание графиков matplotlib без запуска X-сервера

[[email protected] ~]$ 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 
>>> 

ответ

260

@ ответ Нила является один (отлично действует!) Способ сделать это, но вы также simply call matplotlib.use('Agg')before importing matplotlib.pyplot, а затем может продолжаться в обычном режиме.

E.g.

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, and gdk backends может использоваться без X-сервера. Однако по умолчанию будет создан только бэкэнд Agg (я думаю?), Поэтому есть хорошая вероятность, что другие бэкэнд могут быть не включены в вашей конкретной установке.

В качестве альтернативы вы можете просто установить параметр backend в свой файл .matplotlibrc, чтобы автоматически использовать matplotlib.pyplot с помощью данного средства визуализации.

+0

Мне кажется безумным, что вам нужно дважды импортировать matplotlib. Есть ли более простой способ? –

+9

Для чего это стоит, вы фактически не импортируете matplotlib дважды. Вы импортируете matplotlib и импортируете подмодуль, который не импортируется автоматически. Есть и другие способы, да (например, изменить файл '.maplotlibrc'), это самый простой. –

+0

что делать, если я уже импортировал pyplot? могу я все еще это сделать? –

18

Вам необходимо использовать API matplotlib напрямую, а не проходить через интерфейс pylab. Там хороший пример здесь:

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

+1

Я работаю с 'ssh' и' screen' и, кроме предложения 'matplotlib.use ('Agg'), это было единственным решением, которое сработало. Спасибо за вклад – user3085931

+0

@ user3085931: Приятно знать, что мой ответ по-прежнему полезен кому-то через 5 лет после того, как я его написал! Спасибо, что дали мне знать. –

Смежные вопросы