J'essaie d'utiliser networkx avec Python. Lorsque j'exécute ce programme, il obtient cette erreur. Y a-t-il quelque chose qui manque?
#!/usr/bin/env python
import networkx as nx
import matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_node(1)
G.add_nodes_from([2,3,4,5,6,7,8,9,10])
#nx.draw_graphviz(G)
#nx_write_dot(G, 'node.png')
nx.draw(G)
plt.savefig("/var/www/node.png")
Traceback (most recent call last):
File "graph.py", line 13, in <module>
nx.draw(G)
File "/usr/lib/pymodules/python2.5/networkx/drawing/nx_pylab.py", line 124, in draw
cf=pylab.gcf()
File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 276, in gcf
return figure()
File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 254, in figure
**kwargs)
File "/usr/lib/pymodules/python2.5/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
window = Tk.Tk()
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1650, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
J'ai maintenant une erreur différente:
#!/usr/bin/env python
import networkx as nx
import matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt
matplotlib.use('Agg')
G=nx.Graph()
G.add_node(1)
G.add_nodes_from([2,3,4,5,6,7,8,9,10])
#nx.draw_graphviz(G)
#nx_write_dot(G, 'node.png')
nx.draw(G)
plt.savefig("/var/www/node.png")
/usr/lib/pymodules/python2.5/matplotlib/__init__.py:835: UserWarning: This call to matplotlib.use() has no effect
because the the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.
if warn: warnings.warn(_use_error_msg)
Traceback (most recent call last):
File "graph.py", line 15, in <module>
nx.draw(G)
File "/usr/lib/python2.5/site-packages/networkx-1.2.dev-py2.5.egg/networkx/drawing/nx_pylab.py", line 124, in draw
cf=pylab.gcf()
File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 276, in gcf
return figure()
File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 254, in figure
**kwargs)
File "/usr/lib/pymodules/python2.5/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
window = Tk.Tk()
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1650, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
J'ai maintenant une erreur différente:
#!/usr/bin/env python
import networkx as nx
import matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt
matplotlib.use('Agg')
G=nx.Graph()
G.add_node(1)
G.add_nodes_from([2,3,4,5,6,7,8,9,10])
#nx.draw_graphviz(G)
#nx_write_dot(G, 'node.png')
nx.draw(G)
plt.savefig("/var/www/node.png")
/usr/lib/pymodules/python2.5/matplotlib/__init__.py:835: UserWarning: This call to matplotlib.use() has no effect
because the the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.
if warn: warnings.warn(_use_error_msg)
Traceback (most recent call last):
File "graph.py", line 15, in <module>
nx.draw(G)
File "/usr/lib/python2.5/site-packages/networkx-1.2.dev-py2.5.egg/networkx/drawing/nx_pylab.py", line 124, in draw
cf=pylab.gcf()
File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 276, in gcf
return figure()
File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 254, in figure
**kwargs)
File "/usr/lib/pymodules/python2.5/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
window = Tk.Tk()
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1650, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
python
matplotlib
graph
krisdigitx
la source
la source
Réponses:
Le problème principal est que (sur votre système) matplotlib choisit un backend utilisant x par défaut. Je viens d'avoir le même problème sur l'un de mes serveurs. La solution pour moi était d'ajouter le code suivant dans un endroit qui est lu avant toute autre importation pylab / matplotlib / pyplot :
L'alternative est de le placer dans votre .matplotlibrc
la source
backend: agg
dans~/.config/matplotlib'/matplotlibrc
(à titre d'exemple, voirhttp: //matplotlib.org/faq/troubleshooting_faq.html#locating-matplotlib-config-dir). Voir aussi matplotlib.org/users/customizing.html , qui a un exemple de fichier de configuration au bas de la page. Trouvez "agg" sur cette page et vous verrez l'option de configuration dont vous avez besoin.Tout comme un complément à la réponse de Reinout.
Le moyen permanent de résoudre ce type de problème est de modifier le fichier .matplotlibrc. Trouvez-le via
Modifiez ensuite le backend de ce fichier en
backend : Agg
. C'est ça.la source
$MATPLOTLIBRC
Conseil de pro: définissez le répertoire dans lequel vous souhaitez jeter votre propre matplotlibrc.La bonne réponse est de prendre un peu de temps pour préparer correctement votre environnement d'exécution.
La première technique que vous devez préparer votre environnement d'exécution consiste à utiliser un
matplotlibrc
fichier, comme recommandé judicieusement par Chris Q. , en définissantdans ce fichier. Vous pouvez même contrôler - sans changement de code - comment et où matplotlib recherche et trouve le
matplotlibrc
fichier .La deuxième technique pour préparer votre environnement d'exécution est d'utiliser la
MPLBACKEND
variable d'environnement (et d'informer vos utilisateurs de s'en servir):C'est pratique car vous n'avez même pas besoin de fournir un autre fichier sur le disque pour que cela fonctionne. J'ai utilisé cette approche avec, par exemple, des tests en intégration continue et en cours d'exécution sur des machines distantes qui n'ont pas d'écran.
Coder en dur votre backend matplotlib à "Agg" dans votre code Python, c'est comme frapper une cheville carrée dans un trou rond avec un gros marteau, quand, à la place, vous auriez pu dire à matplotlib qu'il doit être un trou carré.
la source
J'ai eu l'erreur lors de l'utilisation de matplotlib via Spark.
matplotlib.use('Agg')
ne fonctionne pas pour moi. En fin de compte, le code suivant fonctionne pour moi. Plus icila source
Je vais simplement répéter ce que @Ivo Bosticky a dit, ce qui peut être ignoré. Mettez ces lignes au TRÈS début du fichier py.
Ou on obtiendrait une erreur
Cela résoudra tous les problèmes d'affichage
la source
J'ai trouvé que cet extrait de code fonctionnait bien lors de la commutation entre les environnements X et non-X.
la source
Lorsque vous vous connectez au serveur pour exécuter le code, utilisez plutôt ceci:
le
-X
supprimera le nom sans affichage et aucune erreur de variable d'environnement $ DISPLAY:)
la source
-o ServerAliveCountMax=120 -o ServerAliveInterval=30
ce qui fera que le client ssh enverra un paquet vide toutes les 30 secondes pendant 1 heure maximum.Sur quel système êtes-vous? Il semble que vous ayez un système avec X11, mais la variable d'environnement DISPLAY n'a pas été correctement définie. Essayez d'exécuter la commande suivante, puis réexécutez votre programme:
la source
Ça marche pour moi.
la source
Une autre chose à vérifier est de savoir si votre utilisateur actuel est autorisé à se connecter à l'écran X. Dans mon cas, root n'était pas autorisé à le faire et matplotlib se plaignait de la même erreur.
la source:
http://www.debian-administration.org/articles/494https://debian-administration.org/article/494/Getting_X11_forwarding_through_ssh_working_after_running_sula source
Pour vous assurer que votre code est portable sur Windows, Linux et OSX et pour les systèmes avec et sans écrans, je suggère l'extrait de code suivant:
Crédit: https://stackoverflow.com/a/45756291/207661
la source
Pour Google Cloud Machine Learning Engine:
Et puis pour imprimer dans un fichier:
et pour créer le PDF:
la source