Создание графиков matplotlib без запуска X-сервера
Кажется, что Matplotlib требует переменную среды $DISPLAY, что означает работающий X-сервер.
Некоторые веб-хостинговые службы не позволяют запускать сеанс 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
>>>
Ответы
Ответ 1
@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')
Вам также не нужно использовать сервер Agg. pdf, ps, svg, agg, cairo и gdk backends могут использоваться без X-сервера. Однако по умолчанию будет создан только бэкэнд Agg (я думаю?), Поэтому есть хорошие шансы, что другие бэкэнд не будут включены в вашей конкретной установке.
В качестве альтернативы вы можете просто установить параметр backend в .matplotlibrc
, чтобы автоматически использовать matplotlib.pyplot
данный обработчик.
Ответ 2
Вам нужно использовать API matplotlib напрямую, а не проходить через интерфейс pylab. Здесь есть хороший пример:
http://www.dalkescientific.com/writings/diary/archive/2005/04/23/matplotlib_without_gui.html