Generación de gráficos de matplotlib sin un servidor X en ejecución

Matplotlib parece requerir la variable de entorno $ DISPLAY que significa un servidor X en ejecución.
Algunos servicios de alojamiento web no permiten una sesión del servidor X en ejecución.
¿Hay una manera de generar gráficos usando matplotlib sin un servidor X en ejecución?

[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 "", line 1, in  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 >>> 

La respuesta de @Neil es una forma (¡perfectamente válida!) De hacerlo, pero también puede simplemente llamar a matplotlib.use('Agg') antes de importar matplotlib.pyplot , y luego continuar con la normalidad.

P.ej

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

No tienes que usar el backend de Agg, también. Los backends pdf, ps, svg, agg, cairo y gdk se pueden usar sin un servidor X. Sin embargo, solo el backend de Agg se construirá de forma predeterminada (¿creo?), Por lo que es muy probable que los otros backends no estén habilitados en su instalación en particular.

Alternativamente, simplemente puede configurar el parámetro de backend en su archivo .matplotlibrc para que matplotlib.pyplot use automáticamente el renderizador dado.

Debe utilizar la API matplotlib directamente en lugar de ir a través de la interfaz pylab. Aquí hay un buen ejemplo:

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