Estoy tratando de usar networkx con Python. Cuando ejecuto este programa, aparece este error. ¿Falta algo?
#!/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
Me sale un error diferente ahora:
#!/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
Me sale un error diferente ahora:
#!/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
fuente
fuente
Respuestas:
El principal problema es que (en su sistema) matplotlib elige un backend que usa x por defecto. Acabo de tener el mismo problema en uno de mis servidores. La solución para mí fue agregar el siguiente código en un lugar que se lee antes de cualquier otra importación de pylab / matplotlib / pyplot :
La alternativa es configurarlo en su .matplotlibrc
fuente
backend: agg
en~/.config/matplotlib'/matplotlibrc
(como ejemplo, consulte http://matplotlib.org/faq/troubleshooting_faq.html#locating-matplotlib-config-dir). Consulte también matplotlib.org/users/customizing.html , que tiene un archivo de configuración de ejemplo en la parte inferior de la página. Busque "agg" en esa página y verá la opción de configuración que necesita.Solo como un complemento de la respuesta de Reinout.
La forma permanente de resolver este tipo de problema es editar el archivo .matplotlibrc. Encuéntralo a través de
Luego modifique el backend en ese archivo a
backend : Agg
. Eso es.fuente
$MATPLOTLIBRC
que el directorio en el que desea lanzar su propia matplotlibrc en.La respuesta clara es tomarse un poco de tiempo para preparar correctamente su entorno de ejecución.
La primera técnica que tiene para preparar su entorno de ejecución es usar un
matplotlibrc
archivo, como lo recomienda sabiamente Chris Q. , estableciendoen ese archivo Incluso puede controlar, sin cambios de código, cómo y dónde busca y encuentra el
matplotlibrc
archivo matplotlib .La segunda técnica que tiene para preparar su entorno de ejecución es utilizar la
MPLBACKEND
variable de entorno (e informar a sus usuarios para que la utilicen):Esto es útil porque ni siquiera tiene que proporcionar otro archivo en el disco para que esto funcione. He empleado este enfoque con, por ejemplo, pruebas en integración continua y ejecución en máquinas remotas que no tienen pantallas.
Codificar su back-end matplotlib a "Agg" en su código Python es como golpear una clavija cuadrada en un agujero redondo con un gran martillo, cuando, en cambio, podría haberle dicho a matplotlib que debe ser un agujero cuadrado.
fuente
Recibí el error al usar matplotlib a través de Spark.
matplotlib.use('Agg')
no funciona para mi Al final, el siguiente código funciona para mí. Más aquífuente
Solo repetiré lo que dijo @Ivo Bosticky que se puede pasar por alto. Pon estas líneas al comienzo MUY del archivo py.
O uno obtendría un error
Esto resolverá todos los problemas de visualización
fuente
Encontré que este fragmento funciona bien al cambiar entre entornos X y no X.
fuente
Al iniciar sesión en el servidor para ejecutar el código, use esto en su lugar:
la
-X
va a deshacerse de la pantalla sin nombre y sin $ DISPLAY error variable de entorno:)
fuente
-o ServerAliveCountMax=120 -o ServerAliveInterval=30
que hará que el cliente ssh envíe un paquete vacío cada 30 segundos durante un máximo de 1 hora.¿En qué sistema estás? Parece que tiene un sistema con X11, pero la variable de entorno DISPLAY no se configuró correctamente. Intente ejecutar el siguiente comando y luego vuelva a ejecutar su programa:
fuente
Esto funciona para mi.
fuente
Otra cosa que debe verificar es si su usuario actual está autorizado para conectarse a la pantalla X. En mi caso, root no tenía permitido hacer eso y matplotlib se quejaba con el mismo error.
fuente:
http://www.debian-administration.org/articles/494https://debian-administration.org/article/494/Getting_X11_forwarding_through_ssh_working_after_running_sufuente
Para asegurarse de que su código sea portátil en Windows, Linux y OSX y para sistemas con y sin pantallas, sugeriría el siguiente fragmento:
Crédito: https://stackoverflow.com/a/45756291/207661
fuente
Para Google Cloud Machine Learning Engine:
Y luego imprimir a archivo:
y para crear el PDF:
fuente