当DISPLAY未定义时,用matplotlib生成一个PNG

我正在尝试使用Python的networkx。 当我运行这个程序时,得到这个错误。 有什么遗漏吗?

#!/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 

我现在得到一个不同的错误:

 #!/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 

我现在得到一个不同的错误:

 #!/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 

主要的问题是(在你的系统上)matplotlib默认select一个x-use后端。 我在我的一台服务器上遇到同样的问题。 对我来说,解决scheme是将以下代码添加到其他任何其他pylab / matplotlib / pyplot导入读取的位置:

 import matplotlib # Force matplotlib to not use any Xwindows backend. matplotlib.use('Agg') 

另一种方法是将其设置在.matplotlibrc中

就像Reinit的答案一样。

解决这类问题的永久方法是编辑.matplotlibrc文件。 通过find它

 >>> import matplotlib 
>>> matplotlib.matplotlib_fname() # This is the file location in Ubuntu '/etc/matplotlibrc'

然后修改该文件中的backend : Aggbackend : Agg 。 这就对了。

我只会重复一下@博沃茨基所说的可以忽略的东西。 把这些行放在py文件的非常开始。

 import matplotlib matplotlib.use('Agg') 

或者一个会得到错误

 * / usr / lib / pymodules / python2.7 / matplotlib / __ init__.py:923:UserWarning:这个对matplotlib.use()的调用没有效果
因为后端已经被选中了;
必须在* pylab,matplotlib.pyplot,*之前调用matplotlib.use()

这将解决所有显示问题

干净的答案是花一点时间正确地准备你的执行环境。

你必须准备好执行环境的第一个技巧就是使用一个matplotlibrc文件, 正如克里斯·Q所明智地推荐的那样 ,设置

 backend : Agg 

在那个文件里 您甚至可以控制 – 无需更改代码 – matplotlib查找和查找matplotlibrc文件的方式和位置 。

您必须准备执行环境的第二个技巧是使用MPLBACKEND环境variables (并通知用户使用它):

 export MPLBACKEND="agg" python <program_using_matplotlib.py> 

这很方便,因为你甚至不需要在磁盘上提供另一个文件来完成这个工作。 我已经采用这种方法,例如,持续集成testing,并在没有显示器的远程机器上运行。

在您的Python代码中将matplotlib后端硬编码为“Agg”,就像是用一个大锤子将一个方形钉子钉入一个圆孔,相反,您可以告诉matplotlib它需要是一个方孔。

我通过Spark使用matplotlib时遇到了错误。 matplotlib.use('Agg')不适用于我。 最后,下面的代码适用于我。 更多在这里

 import matplotlib.pyplot as plt. plt.switch_backend('agg') 

login到服务器执行代码时,请使用下面的代码:

 ssh -X username@servername 

-X将摆脱无显示名称和$ DISPLAY环境variables错误

🙂

在X和no-X环境之间切换时,我发现这个片段能很好地工作。

 import os import matplotlib as mpl if os.environ.get('DISPLAY','') == '': print('no display found. Using non-interactive Agg backend') mpl.use('Agg') import matplotlib.pyplot as plt 

你在什么系统上? 看起来你有一个X11系统,但是DISPLAY环境variables没有正确设置。 尝试执行以下命令,然后重新运行程序:

 export DISPLAY=localhost:0 

还有一件事要检查你的当前用户是否被授权连接到X显示器。 在我的情况下,根不能做到这一点,matplotlib抱怨有同样的错误。

 user@debian:~$ xauth list debian/unix:10 MIT-MAGIC-COOKIE-1 ae921efd0026c6fc9d62a8963acdcca0 root@debian:~# xauth add debian/unix:10 MIT-MAGIC-COOKIE-1 ae921efd0026c6fc9d62a8963acdcca0 root@debian:~# xterm 

来源: http : //www.debian-administration.org/articles/494

对于Google云端机器学习引擎:

 import matplotlib as mpl mpl.use('Agg') from matplotlib.backends.backend_pdf import PdfPages 

然后打印到文件:

 #PDF build and save def multi_page(filename, figs=None, dpi=200): pp = PdfPages(filename) if figs is None: figs = [mpl.pyplot.figure(n) for n in mpl.pyplot.get_fignums()] for fig in figs: fig.savefig(pp, format='pdf', bbox_inches='tight', fig_size=(10, 8)) pp.close() 

并创buildPDF:

 multi_page(report_name)