web-dev-qa-db-fra.com

Comment enregistrer une figure à distance avec pylab?

J'essaie de générer un chiffre sur un ordinateur distant avec la commande pylab.savefig. Mais j'ai eu une telle erreur:

Unable to access the X Display, is $DISPLAY set properly?

Comment puis-je enregistrer le chiffre correctement?

71
gerry

Par défaut, matplotlib utilisera quelque chose comme le backend TkAgg. Cela nécessite un serveur X pour fonctionner.

Bien que vous puissiez simplement utiliser le transfert X, il y aura un décalage notable lorsque matplotlib essaie de se connecter avec le serveur X distant. Si vous n'avez pas besoin d'interagir avec l'intrigue, il est souvent plus agréable d'accélérer les choses en évitant complètement une connexion X.

Si vous voulez faire un tracé sans avoir besoin d'un serveur X, utilisez plutôt le Aggbackend .

Par exemple. faites quelque chose comme ça:

import matplotlib
matplotlib.use('Agg') # Must be before importing matplotlib.pyplot or pylab!
import matplotlib.pyplot as plt

fig = plt.figure()
plt.plot(range(10))
fig.savefig('temp.png')

Si vous voulez que ce soit le comportement par défaut, vous pouvez modifier votre fichier matplotlibrc pour utiliser le backend Agg par défaut.

Voir cet article pour plus d'informations .

139
Joe Kington

Umm, définir la variable DISPLAY correctement?

Les graphiques sur le réseau utilisant X11 fonctionnent par l'ordinateur client (distant) ayant une variable d'environnement DISPLAY qui indique où dessiner les graphiques. En général, ce serait quelque chose comme mydesktop.example.com:0.0 - puis lorsqu'un programme X11 essaie de dessiner quelque chose, il se propage sur le réseau vers mydesktop.example.com, qui est la machine devant laquelle vous êtes assis (le X serveur) et il apparaît.

Maintenant, si la machine devant vous est Windows, vous devrez obtenir un serveur X quelque part - cygwin/X11 ou eXceed commercial fera l'affaire.

Vous devez également vous assurer que la sécurité est gérée - vous ne pouvez pas demander à quiconque d'écrire sur votre écran via le réseau.

Comment vous connectez-vous à la machine distante? Parce que si vous passez d'une boîte Linux à une autre boîte Linux avec ssh, la solution simple est probablement `` Utilisez ssh -X foo.example.com '' pour vous connecter - cela canalise la connexion X11 sur une socket locale.

Donc, si ssh -X n'est pas la réponse, pouvons-nous avoir plus d'informations sur les systèmes d'exploitation impliqués, s'il vous plaît?

1
Spacedman