168 votes

Génération de graphiques matplotlib sans serveur X en fonctionnement

Matplotlib semble avoir besoin de la variable d'environnement $DISPLAY, ce qui signifie que le serveur X est en marche.
Certains services d'hébergement Web n'autorisent pas une session de serveur X en cours.
Existe-t-il un moyen de générer des graphiques à l'aide de matplotlib sans serveur X en fonctionnement ?

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

316voto

Joe Kington Points 68089

La réponse de @Neil est une façon (parfaitement valable !) de le faire, mais vous pouvez aussi appelez simplement matplotlib.use('Agg') avant Importation de matplotlib.pyplot puis continuez comme si de rien n'était.

Par exemple

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'êtes pas non plus obligé d'utiliser le backend Agg. Le site backends pdf, ps, svg, agg, cairo, et gdk peuvent tous être utilisés sans serveur X. Cependant, seul le backend Agg sera construit par défaut (je pense ?), il y a donc 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 fichier pour avoir automatiquement matplotlib.pyplot utiliser le moteur de rendu donné.

20voto

Neil Vass Points 1096

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X