Generowanie wykresów matplotlib bez uruchomionego serwera X [duplikat]

To pytanie ma już odpowiedź tutaj:

Matplotlib wydaje się wymagać zmiennej środowiskowej $DISPLAY, co oznacza działający serwer X.
niektóre usługi hostingowe nie pozwalają na uruchamianie sesji serwera X.
czy jest sposób na generowanie wykresów za pomocą matplotlib bez działającego serwera X?

[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
>>>
Author: Joe Kington, 2011-02-08

2 answers

@Neil ' s answer is one (perfectly valid!) sposób, ale można też po prostu zadzwonić matplotlib.use('Agg') przed importowaniem matplotlib.pyplot, a następnie kontynuować jak zwykle.

Np.

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')

Nie musisz również używać backendu Agg. Pliki backendowe pdf, PS, svg, agg, cairo i gdk mogą być używane bez serwera X. Jednak domyślnie zostanie zbudowany tylko backend Agg (myślę?), więc istnieje duża szansa, że inne backendy mogą nie być włączone na Twoim konkretna instalacja.

Alternatywnie, można po prostu ustawić parametr backend w swoim .matplotlibrc plik ma automatycznie matplotlib.pyplot używać podanego renderera.

 291
Author: Joe Kington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-14 12:01:46

Musisz użyć API matplotlib bezpośrednio, zamiast przechodzić przez interfejs pylab. Jest tu dobry przykład:

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

 20
Author: Neil Vass,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-08 09:34:05