Próbuję używać Networkx z Pythonem. Po uruchomieniu tego programu pojawia się ten błąd. Czy czegoś brakuje?
#!/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
Otrzymuję teraz inny błąd:
#!/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
Otrzymuję teraz inny błąd:
#!/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
źródło
źródło
Odpowiedzi:
Głównym problemem jest to, że (w twoim systemie) matplotlib domyślnie wybiera backend wykorzystujący x. Właśnie miałem ten sam problem na jednym z moich serwerów. Rozwiązaniem było dla mnie dodanie następującego kodu w miejscu, które jest czytane przed jakimkolwiek innym importem pylab / matplotlib / pyplot :
Alternatywą jest ustawienie go w pliku .matplotlibrc
źródło
backend: agg
w~/.config/matplotlib'/matplotlibrc
(jako przykład, patrzhttp: //matplotlib.org/faq/troublesh_faq.html#locating-matplotlib-config-dir). Zobacz także matplotlib.org/users/customizing.html , który ma przykładowy plik konfiguracyjny na dole strony. Znajdź „agg” na tej stronie, a zobaczysz potrzebną opcję konfiguracji.Tylko jako uzupełnienie odpowiedzi Reinouta.
Stałym sposobem rozwiązania tego rodzaju problemu jest edycja pliku .matplotlibrc. Znajdź to przez
Następnie zmodyfikuj backend w tym pliku na
backend : Agg
. To jest to.źródło
$MATPLOTLIBRC
do katalogu , w którym chcesz, aby rzucić swój własny matplotlibrc w.Czystą odpowiedzią jest prawidłowe przygotowanie środowiska wykonawczego.
Pierwszą techniką, którą musisz przygotować środowisko wykonawcze, jest użycie
matplotlibrc
pliku, jak mądrze zalecił Chris Q. , ustawieniew tym pliku. Możesz nawet kontrolować - bez zmian kodu - jak i gdzie matplotlib szuka i znajduje
matplotlibrc
plik .Drugą techniką, którą musisz przygotować środowisko wykonawcze, jest użycie
MPLBACKEND
zmiennej środowiskowej (i poinformowanie użytkowników, aby z niej skorzystali):Jest to przydatne, ponieważ nie trzeba nawet udostępniać innego pliku na dysku, aby to działało. Zastosowałem to podejście, na przykład testując w ciągłej integracji i działając na zdalnych komputerach, które nie mają wyświetlaczy.
Twarde kodowanie backendu matplotlib do „Agg” w kodzie Python jest jak walenie kwadratowego kołka w okrągły otwór dużym młotkiem, kiedy zamiast tego mogłeś po prostu powiedzieć matplotlib, że musi to być kwadratowy otwór.
źródło
Wystąpił błąd podczas używania matplotlib przez Spark.
matplotlib.use('Agg')
nie działa dla mnie Ostatecznie poniższy kod działa dla mnie. Więcej tutajźródło
Powtórzę tylko to, co powiedział @Ivo Bosticky, co można przeoczyć. Umieść te linie na BARDZO początku pliku py.
Lub ktoś dostanie błąd
To rozwiąże wszystkie problemy z wyświetlaniem
źródło
Odkryłem, że ten fragment kodu działa dobrze podczas przełączania między środowiskami X i no-X.
źródło
Podczas logowania do serwera w celu wykonania kodu użyj tego zamiast tego:
-X
będzie pozbyć się bez imienia i bez błędu wyświetlania zmiennej środowiska $ DISPLAY:)
źródło
-o ServerAliveCountMax=120 -o ServerAliveInterval=30
co spowoduje, że klient ssh będzie wysyłać pusty pakiet co 30 sekund przez maksymalnie 1 godzinę.W jakim systemie jesteś? Wygląda na to, że masz system z X11, ale zmienna środowiskowa DISPLAY nie została poprawnie ustawiona. Spróbuj wykonać następujące polecenie, a następnie uruchom ponownie program:
źródło
Mi to pasuje.
źródło
Inną sprawą do sprawdzenia jest to, czy aktualny użytkownik jest uprawniony do połączenia z wyświetlaczem X. W moim przypadku root nie mógł tego zrobić i matplotlib narzekał z tym samym błędem.
źródło:
http://www.debian-administration.org/articles/494https://debian-administration.org/article/494/Getting_X11_forwarding_through_ssh_working_after_running_suźródło
Aby mieć pewność, że Twój kod jest przenośny w systemach Windows, Linux i OSX oraz w systemach z wyświetlaczami i bez nich, sugerowałbym następujący fragment:
Źródło: https://stackoverflow.com/a/45756291/207661
źródło
W przypadku Google Cloud Machine Learning Engine:
A następnie, aby wydrukować do pliku:
i aby utworzyć plik PDF:
źródło