web-dev-qa-db-fra.com

Générer des graphiques matplotlib sans un serveur X actif

Matplotlib semble nécessiter la variable d'environnement $ DISPLAY, 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.
Y at-il un moyen de générer des graphiques en utilisant matplotlib sans un serveur X en cours d’exécution?

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

La réponse de @ Neil est un moyen (parfaitement valide!) De le faire, mais vous pouvez aussi simplement appeler matplotlib.use('Agg') avant l'importation _matplotlib.pyplot_ , puis continuez normalement.

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'avez pas non plus besoin d'utiliser le backend Agg. Les 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 bonnes 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 afin que _matplotlib.pyplot_ utilise automatiquement le rendu donné.

317
Joe Kington

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

21
Neil Vass