Ich versuche, networkx mit Python zu verwenden. Wenn ich dieses Programm starte, wird dieser Fehler angezeigt. Fehlt etwas?
#!/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
Ich erhalte jetzt einen anderen Fehler:
#!/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
Ich erhalte jetzt einen anderen Fehler:
#!/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
quelle
quelle
Antworten:
Das Hauptproblem ist, dass matplotlib (auf Ihrem System) standardmäßig ein x-using-Backend auswählt. Ich hatte gerade das gleiche Problem auf einem meiner Server. Die Lösung für mich bestand darin, den folgenden Code an einer Stelle hinzuzufügen, die vor jedem anderen Import von Pylab / Matplotlib / Pyplot gelesen wird :
Die Alternative besteht darin, es in Ihrem .matplotlibrc einzustellen
quelle
backend: agg
in~/.config/matplotlib'/matplotlibrc
(als Beispiel siehe unten: //matplotlib.org/faq/troubleshooting_faq.html#locating-matplotlib-config-dir). Siehe auch matplotlib.org/users/customizing.html , das unten auf der Seite eine Beispielkonfigurationsdatei enthält. Suchen Sie auf dieser Seite nach "agg" und Sie sehen die Konfigurationsoption, die Sie benötigen.Nur als Ergänzung zu Reinouts Antwort.
Die dauerhafte Möglichkeit, diese Art von Problem zu lösen, besteht darin, die .matplotlibrc-Datei zu bearbeiten. Finden Sie es über
Ändern Sie dann das Backend in dieser Datei in
backend : Agg
. Das ist es.quelle
$MATPLOTLIBRC
das Verzeichnis ein, in das Sie Ihr eigenes Matplotlibrc werfen möchten.Die saubere Antwort ist, sich ein wenig Zeit zu nehmen, um Ihre Ausführungsumgebung richtig vorzubereiten.
Die erste Technik müssen Sie Ihre Ausführungsumgebung vorzubereiten , ist eine verwenden
matplotlibrc
Datei, wie klug von Chris F. empfohlen , Einstellungin dieser Datei. Sie können sogar ohne Codeänderungen steuern, wie und wo matplotlib die
matplotlibrc
Datei sucht und findet .Die zweite Technik, die Sie zur Vorbereitung Ihrer Ausführungsumgebung benötigen, besteht darin, die
MPLBACKEND
Umgebungsvariable zu verwenden (und Ihre Benutzer zu informieren, diese zu verwenden):Dies ist praktisch, da Sie nicht einmal eine andere Datei auf der Festplatte bereitstellen müssen, damit dies funktioniert. Ich habe diesen Ansatz beispielsweise beim Testen der kontinuierlichen Integration und beim Ausführen auf Remotecomputern ohne Anzeige angewendet.
Das Hardcodieren Ihres Matplotlib-Backends auf "Agg" in Ihrem Python-Code ist wie das Schlagen eines quadratischen Stifts in ein rundes Loch mit einem großen Hammer, wenn Sie stattdessen einfach Matplotlib hätten sagen können, dass es ein quadratisches Loch sein muss.
quelle
Ich habe den Fehler bei der Verwendung von matplotlib über Spark erhalten.
matplotlib.use('Agg')
funktioniert bei mir nicht Am Ende funktioniert der folgende Code für mich. Mehr hierquelle
Ich werde nur wiederholen, was @Ivo Bosticky gesagt hat, was übersehen werden kann. Setzen Sie diese Zeilen an den SEHREN Anfang der py-Datei.
Oder man würde Fehler bekommen
Dadurch werden alle Anzeigeprobleme behoben
quelle
Ich fand, dass dieses Snippet gut funktioniert, wenn zwischen X- und No-X-Umgebungen gewechselt wird.
quelle
Wenn Sie sich beim Server anmelden, um den Code auszuführen, verwenden Sie stattdessen Folgendes:
das
-X
wird die keine Anzeige loswerden Namen erhalten und keine $ DISPLAY Umgebungsvariable Fehler:) :)
quelle
-o ServerAliveCountMax=120 -o ServerAliveInterval=30
, dass der SSH-Client maximal 1 Stunde lang alle 30 Sekunden ein leeres Paket sendet.Auf welchem System bist du? Es sieht so aus, als hätten Sie ein System mit X11, aber die Umgebungsvariable DISPLAY wurde nicht richtig eingestellt. Führen Sie den folgenden Befehl aus und führen Sie das Programm erneut aus:
quelle
Für mich geht das.
quelle
Sie müssen auch prüfen, ob Ihr aktueller Benutzer berechtigt ist, eine Verbindung zum X-Display herzustellen. In meinem Fall durfte root das nicht und matplotlib beschwerte sich mit demselben Fehler.
Quelle:
http://www.debian-administration.org/articles/494https://debian-administration.org/article/494/Getting_X11_forwarding_through_ssh_working_after_running_suquelle
Um sicherzustellen, dass Ihr Code unter Windows, Linux und OSX sowie für Systeme mit und ohne Anzeige portierbar ist, würde ich folgendes Snippet vorschlagen:
Bildnachweis: https://stackoverflow.com/a/45756291/207661
quelle
Für die Google Cloud Machine Learning Engine:
Und dann zum Drucken in eine Datei:
und um das PDF zu erstellen:
quelle