#!/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
#1 楼
主要问题是(在您的系统上)matplotlib默认情况下选择使用x的后端。我在其中一台服务器上遇到了同样的问题。对我来说,解决方案是将以下代码添加到任何其他pylab / matplotlib / pyplot导入之前都可以读取的位置:import matplotlib
# Force matplotlib to not use any Xwindows backend.
matplotlib.use('Agg')
替代方法是将其设置为您的.matplotlibrc
评论
重要说明:导入pyplot之前,需要先调用.use。因此,例如,如果您只是尝试导入pyplot,则需要先导入matplotlib,调用use,然后再导入pyplot。
–seaotternerd
13年8月8日在9:15
上面的评论将通过此答案进行更多说明。
–艾奥尼斯·菲利皮迪斯(Ioannis Filippidis)
2014年2月28日在6:15
您如何“在您的.matplotlibrc中设置”?
–tommy.carstensen
15年7月5日在20:32
后端:〜/ .config / matplotlib'/ matplotlibrc中的agg(例如,请参见http://matplotlib.org/faq/troubleshooting_faq.html#locating-matplotlib-config-dir)。另请参见matplotlib.org/users/customizing.html,该文件在页面底部具有示例配置文件。在该页面上找到“ agg”,您将看到所需的配置选项。
– Reinout van Rees
15年7月6日在8:48
作为参考,这是解释此内容的matplotlib文档的链接。 (+1,很好的答案,对我有很大帮助!)
– Tim S.
16-2-4在20:24
#2 楼
作为Reinout答案的补充。解决此类问题的永久方法是编辑.matplotlibrc文件。通过
>>> import matplotlib>>> matplotlib.matplotlib_fname()
# This is the file location in Ubuntu
'/etc/matplotlibrc'
找到它,然后将该文件中的后端修改为
backend : Agg
。就这样。评论
专家提示:将$ MATPLOTLIBRC设置为您想要在其中放置自己的matplotlibrc的目录。
–肯尼斯·赫斯特(Kenneth Hoste)
13年8月29日在18:19
有点像这样的问题,但我想服务器是否总是无头工作,修改配置文件是有意义的。这会对matplotlib的功能产生任何副作用吗?
–布鲁斯·约翰·詹纳·劳索(BruceJohnJennerLawso)
16/09/13在1:45
我在Web服务器上运行matplotlib,所以这就是我的答案。我还没有注意到任何副作用。
– Spitz
17年11月25日在12:14
#3 楼
明确的答案是花一些时间正确准备执行环境。准备准备执行环境的第一种技术是使用
matplotlibrc
文件,这是Chris Q.明智的建议。在该文件中设置backend : Agg
。您甚至可以控制matplotlib并在其中查找
matplotlibrc
文件的方式和位置,而无需更改代码。准备执行环境的第二种方法是使用
MPLBACKEND
环境变量(并通知您的用户可以使用它):export MPLBACKEND="agg"
python <program_using_matplotlib.py>
这很方便,因为您甚至不必在磁盘上提供另一个文件即可完成此工作。我采用了这种方法,例如,在持续集成中进行测试,并在没有显示器的远程计算机上运行。
将您的matplotlib后端硬编码为Python代码中的“ Agg”就像用大铁锤将方钉锤打入圆孔中,相反,您本可以告诉matplotlib它必须是方孔。
评论
在这种情况下,第二种技术看起来最优雅。
–德米特里·卡巴诺夫(Dmitry Kabanov)
17-10-17在20:22
使用MPLBACKEND为我解决了它。绝对是最优雅的方式!
–SaturnFromTitan
18年5月18日在4:32
#4 楼
通过Spark使用matplotlib时出现错误。matplotlib.use('Agg')
对我不起作用。最后,以下代码对我有用。在这里更多import matplotlib.pyplot as plt.
plt.switch_backend('agg')
评论
这很好用,没有对用于导入matplotlib和其他库的顺序的限制。
–PabTorre
17年5月5日在15:40
在Spark上运行时,是否必须将其限制为在头节点上运行,还是在工作程序节点上运行时使其运行?
–萨卡
17年9月24日在6:57
我在django项目中使用了它,这是我可以使其工作的唯一方法。
– HenryM
18年2月3日在16:28
#5 楼
我将重复@Ivo Bosticky所说的话,但可以忽略。将这些行放在py文件的非常开头。import matplotlib
matplotlib.use('Agg')
否则会出错
*/usr/lib/pymodules/python2.7/matplotlib/__init__.py:923: 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,*
这将解决所有展示广告问题
#6 楼
我发现此代码段在X和非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
评论
我认为,尽管它不能直接回答问题,也可以回答未提出的问题,但它是一种比接受的解决方案更好的解决方案。
–荒木大辅(Daisuke Aramaki)
17年2月14日在11:53
#7 楼
登录服务器以执行代码时,请使用以下代码:ssh -X username@servername
-X
将摆脱没有显示名称和没有$ DISPLAY环境变量的情况错误
:)
评论
我需要使用'-X'来保存.png图像。非常感谢。
–不
2012年12月12日在22:02
如果ssh超时,或者由于某种原因需要断开连接,则将导致长时间的失败。请注意,如果连接的客户端进入睡眠状态,甚至可能会发生超时。
–posdef
16年12月13日在16:00
您可以通过添加-o ServerAliveCountMax = 120 -o ServerAliveInterval = 30来防止超时,这将使ssh客户端每30秒发送一个空数据包,最长1小时。
– Alex
19年7月15日在15:42
#8 楼
您在什么系统上?看起来您的系统具有X11,但未正确设置DISPLAY环境变量。尝试执行以下命令,然后重新运行您的程序:export DISPLAY=localhost:0
评论
但是为什么需要设置显示变量,我远程登录到该服务器,它应该做的就是生成一个PNG文件???
–krisdigitx
2010年5月10日上午10:41
@krisdigitx,如果您已远程连接,请不要设置显示变量;而是在连接时使用“ -XY”标志。为了显示,它需要知道将图像发送到哪个Xserver。在这种情况下,它将是您计算机的显示器,而不是远程计算机。使用“ -XY”标志会使SSH自动将DISPLAY变量设置为指向连接计算机的显示。
–迈克尔·亚伦·萨菲恩(Michael Aaron Safyan)
2010年5月10日14:12
@krisdigitx,我同意,这样做很奇怪;我的猜测是,它使用X11绘制图像,然后使用X11保存结果。
–迈克尔·亚伦·萨菲恩(Michael Aaron Safyan)
2010年5月10日14:14
使用$ DISPLAY的此设置在运行Ubuntu 16的EC2上不起作用-无法连接以显示“ localhost:0”
–PabTorre
17年5月5日在15:39
#9 楼
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
对我有用。
#10 楼
要检查的另一件事是您当前的用户是否有权连接到X显示器。就我而言,不允许root用户执行此操作,并且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 https://debian-administration.org/article/494/Getting_X11_forwarding_through_ssh_working_after_running_su
#11 楼
为确保您的代码可在Windows,Linux和OSX上以及具有和不具有显示器的系统之间移植,我建议使用以下代码段:import matplotlib
import os
# must be before importing matplotlib.pyplot or pylab!
if os.name == 'posix' and "DISPLAY" not in os.environ:
matplotlib.use('Agg')
# now import other things from matplotlib
import matplotlib.pyplot as plt
信用:https:// stackoverflow.com/a/45756291/207661
#12 楼
对于Google Cloud Machine Learning Engine: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()
和创建PDF:
multi_page(report_name)
评论
在没有运行X服务器的情况下生成matplotlib图的可能重复项将调用移至其他导入上方的matplotlib.use('Agg'),特别是应在导入matplotlib.pyplot
之前
@IvoBosticky评论也为我解决了这个问题:唯一令人误解的是“在其他进口商品之上”。显然,您需要先导入matplotlib ...这是对我有用的整个设置:import matplotlib // matplotlib.use('Agg')// import matplotlib.pyplot as plt