2011-02-08 4 views
143

Matplotlib semble nécessiter la variable d'environnement $ DISPLAY, ce qui signifie un serveur X en cours d'exécution.
Certains services d'hébergement Web n'autorisent pas l'exécution d'une session de serveur X.
Existe-t-il un moyen de générer des graphiques en utilisant matplotlib sans serveur X en cours d'exécution?Génération de graphes matplotlib sans serveur X en cours d'exécution

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

Répondre

260

@ réponse de Neil est un (parfaitement valable!) Façon de le faire, mais vous pouvez également simply call matplotlib.use('Agg')before importing matplotlib.pyplot, puis continuer normalement.

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

Vous n'avez pas non plus besoin d'utiliser le backend Agg. Le pdf, ps, svg, agg, cairo, and gdk backends peut être utilisé sans serveur X. Cependant, seul le backend Agg sera construit par défaut (je pense?), Donc il y a de fortes chances que les autres backends ne soient pas activés sur votre installation particulière.

Alternativement, vous pouvez simplement définir le paramètre backend dans votre fichier .matplotlibrc pour avoir automatiquement matplotlib.pyplot utiliser le moteur de rendu donné.

+0

Cela me semble fou de devoir importer deux fois matplotlib. Y a-t-il un moyen plus facile? –

+9

Pour ce que ça vaut, vous n'importez pas deux fois matplotlib. Vous importez matplotlib, puis importez un sous-module qui n'est pas importé automatiquement. Il y a d'autres façons, oui (par exemple, changer votre fichier '.maplotlibrc'), c'est le plus simple. –

+0

Et si j'avais déjà importé pyplot? puis-je encore le faire? –

18

Vous devez utiliser l'API matplotlib directement plutôt que de passer par l'interface pylab. Il y a un bon exemple:

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

+1

Je travaille avec 'ssh' et' screen' et en plus de la suggestion 'matplotlib.use ('Agg')', c'était la seule solution qui fonctionnait. Merci pour la contribution – user3085931

+0

@ user3085931: Bon à savoir ma réponse est toujours utile à quelqu'un 5 ans après l'avoir écrit! Merci de me le faire savoir. –

Questions connexes