Estou tentando usar o networkx com Python. Quando executo este programa, esse erro ocorre. Falta alguma coisa?
#!/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
Agora, recebo um erro diferente:
#!/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
Agora, recebo um erro diferente:
#!/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
fonte
fonte
Respostas:
O principal problema é que (no seu sistema) o matplotlib escolhe um back-end usando x por padrão. Eu apenas tive o mesmo problema em um dos meus servidores. A solução para mim foi adicionar o seguinte código em um local que seja lido antes de qualquer outra importação do pylab / matplotlib / pyplot :
A alternativa é configurá-lo no seu .matplotlibrc
fonte
backend: agg
em~/.config/matplotlib'/matplotlibrc
(como exemplo, consulte http://matplotlib.org/faq/trou Troubleshooting_faq.html#locating-matplotlib-config-dir). Veja também matplotlib.org/users/customizing.html , que tem um exemplo de arquivo de configuração na parte inferior da página. Encontre "agg" nessa página e você verá a opção de configuração necessária.Apenas como complemento da resposta de Reinout.
A maneira permanente de resolver esse tipo de problema é editar o arquivo .matplotlibrc. Encontre-o via
Em seguida, modifique o back-end nesse arquivo para
backend : Agg
. É isso.fonte
$MATPLOTLIBRC
o diretório onde você quer jogar seu próprio matplotlibrc no.A resposta limpa é levar um pouco de tempo para preparar corretamente seu ambiente de execução.
A primeira técnica que você precisa para preparar seu ambiente de execução é usar um
matplotlibrc
arquivo, como sabiamente recomendado por Chris Q. , definindonesse arquivo. Você pode controlar - sem alterações de código - como e onde o matplotlib procura e localiza o
matplotlibrc
arquivo .A segunda técnica que você precisa para preparar seu ambiente de execução é usar a
MPLBACKEND
variável de ambiente (e informar seus usuários a utilizá-la):Isso é útil porque você nem precisa fornecer outro arquivo no disco para fazer isso funcionar. Empreguei essa abordagem com, por exemplo, testes em integração contínua e execução em máquinas remotas que não possuem monitores.
Codificar seu back-end do matplotlib para "Agg" no código Python é como bater um pino quadrado em um buraco redondo com um grande martelo, quando, em vez disso, você poderia ter dito ao matplotlib que ele precisava ser um buraco quadrado.
fonte
Eu recebi o erro ao usar o matplotlib através do Spark.
matplotlib.use('Agg')
não funciona para mim. No final, o código a seguir funciona para mim. Mais aquifonte
Vou repetir o que o @Ivo Bosticky disse que pode ser esquecido. Coloque essas linhas no MUITO início do arquivo de py.
Ou um iria receber erro
Isso resolverá todos os problemas de exibição
fonte
Eu achei esse trecho para funcionar bem ao alternar entre ambientes X e não-X.
fonte
Ao entrar no servidor para executar o código, use isto:
a
-X
irá se livrar do erro de variável de ambiente sem nome de exibição e sem $ DISPLAY:)
fonte
-o ServerAliveCountMax=120 -o ServerAliveInterval=30
que fará com que o cliente ssh envie um pacote vazio a cada 30 segundos por no máximo 1 hora.Em que sistema você está? Parece que você possui um sistema com o X11, mas a variável de ambiente DISPLAY não foi definida corretamente. Tente executar o seguinte comando e, em seguida, execute novamente o seu programa:
fonte
Funciona para mim.
fonte
Outra coisa a verificar é se o usuário atual está autorizado a se conectar ao monitor X. No meu caso, o root não tinha permissão para fazer isso e o matplotlib estava reclamando com o mesmo erro.
fonte:
http://www.debian-administration.org/articles/494https://debian-administration.org/article/494/Getting_X11_forwarding_through_ssh_working_after_running_sufonte
Para garantir que seu código seja portável no Windows, Linux e OSX e para sistemas com e sem telas, sugiro o seguinte trecho:
Crédito: https://stackoverflow.com/a/45756291/207661
fonte
Para o Google Cloud Machine Learning Engine:
E, em seguida, para imprimir em arquivo:
e para criar o PDF:
fonte