2011-02-08 20 views
143

Parece que Matplotlib necesita la variable de entorno $ DISPLAY, lo que significa que se está ejecutando un servidor X.
Algunos servicios de alojamiento web no permiten ejecutar una sesión de servidor X.
¿Hay alguna forma de generar gráficos usando matplotlib sin un servidor X en ejecución?Generación de gráficos matplotlib sin un servidor X en ejecución

[[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 
>>> 

Respuesta

260

@ respuesta de Neil es uno (perfectamente válido!) Manera de hacerlo, pero también simply call matplotlib.use('Agg')before importing matplotlib.pyplot, y luego puede continuar normalmente.

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

No tiene que usar el back-end Agg, también. El pdf, ps, svg, agg, cairo, and gdk backends se puede usar sin un servidor X. Sin embargo, solo el backend de Agg se compilará de manera predeterminada (¿no es así?), Por lo que es posible que los otros backends no estén habilitados en su instalación en particular.

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

+0

Me parece una locura que tenga que importar matplotlib dos veces. hay una manera mas facil? –

+9

Por lo que vale, en realidad no está importando matplotlib dos veces. Está importando matplotlib y luego está importando un submódulo que no se importa automáticamente. Hay otras formas, sí (por ejemplo, cambiar el archivo '.maplotlibrc'), esa es la más directa. –

+0

¿y si ya importé pyplot? ¿Todavía puedo hacerlo? –

18

Debe utilizar la API matplotlib directamente en lugar de pasar por la interfaz pylab. Hay un buen ejemplo aquí:

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

+1

Estoy trabajando con 'ssh' y' screen' y además de la sugerencia 'matplotlib.use ('Agg')' esta fue la única solución que funcionó. Gracias por la contribución – user3085931

+0

@ user3085931: ¡Es bueno saber que mi respuesta sigue siendo útil para alguien 5 años después de que la escribí! Gracias por hacérmelo saber. –

Cuestiones relacionadas