Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 未定义显示时使用matplotlib生成PNG_Python_Matplotlib_Graph - Fatal编程技术网

Python 未定义显示时使用matplotlib生成PNG

Python 未定义显示时使用matplotlib生成PNG,python,matplotlib,graph,Python,Matplotlib,Graph,我正在尝试将networkx与Python结合使用。当我运行这个程序时,它得到了这个错误。少了什么吗 #!/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_gra

我正在尝试将networkx与Python结合使用。当我运行这个程序时,它得到了这个错误。少了什么吗

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

你使用的是什么系统?看起来您的系统带有X11,但未正确设置DISPLAY环境变量。尝试执行以下命令,然后重新运行程序:

export DISPLAY=localhost:0

主要问题是,在系统上,matplotlib默认选择使用x的后端。我只是在我的一台服务器上遇到了同样的问题。我的解决方案是在任何其他pylab/matplotlib/pyplot导入之前读取的位置添加以下代码:


另一种方法是在登录到服务器以执行代码时,在.matplotlibrc中设置它 改用这个:

ssh -X username@servername
-X将去掉no display name和no$display环境变量 错误


要检查的另一件事是当前用户是否有权连接到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

资料来源:

这是对雷诺特答案的补充

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

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

然后将该文件中的后端修改为backend:Agg。就是这样。

我只想重复一下@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,*
这将解决所有显示问题

明确的答案是花一点时间正确准备执行环境

准备执行环境的第一项技术是使用matplotlibrc文件,即设置

在那个档案里。您甚至可以在不更改代码的情况下进行控制

准备执行环境的第二种技巧是使用并通知用户使用:

export MPLBACKEND="agg"
python <program_using_matplotlib.py>
这很方便,因为您甚至不需要在磁盘上提供另一个文件来实现这一点。例如,我在连续集成测试中采用了这种方法,并在没有显示器的远程机器上运行


在Python代码中将matplotlib后端硬编码为Agg就像用大锤将一个方钉砸进一个圆孔,而实际上,您可以告诉matplotlib它需要是一个方孔。

在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

我通过Spark使用matplotlib时出错。matplotlib。使用'Agg'对我不起作用。最后,以下代码适用于我。更多


对于谷歌云机器学习引擎:

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)

它适合我。

为了确保您的代码可以跨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

信用证:

但是为什么它需要设置一个显示变量,我远程登录到这个服务器,它所要做的就是生成一个PNG文件???@kridigitx,如果你是远程连接的,不要设置显示变量;连接时使用-XY标志。为了显示,它需要知道将图像发送到哪个Xserver;在这种情况下,它将显示您的计算机,而不是远程计算机。使用-XY标志会使SSH自动设置显示变量,使其指向连接计算机的显示。@kridigitx,我同意,它这样做很奇怪;不过,我的猜测是,它使用X11绘制图像,然后使用X11保存结果。使用$DISPLAY的此设置在运行Ubuntu 16的EC2上不起作用-无法连接到DISPLAY localhost:0可能重复移动调用matplotlib。请在其他导入之前使用'Agg',尤其是在导入matplotlib之前。pyplot@IvoBosticky评论也为我解决了这个问题:唯一有误导性的是你们的其他进口产品。显然,您需要在。。。这是对我起作用的全部设置:导入matplotlib//matplotlib.use'Agg'//import matplotlib.pyplot,因为pltI需要使用“-X”才能保存.png图像。非常感谢。如果ssh超时,或者由于任何原因需要断开连接,这将在很长一段时间内失败。请注意,如果连接的客户端进入睡眠状态,甚至可能会发生超时。您可以通过添加-o ServerAliveCountMax=120-o ServerAliveInterval=30来防止超时,这将使ssh客户端每30秒发送一个空数据包,最长持续1小时。Pro提示:将$MATPLOTLIBRC设置为要将自己的MATPLOTLIBRC放入的目录。类似于对于这样一个问题来说,这太过分了,但是我想如果服务器总是无头工作,那么修改一个配置文件是有意义的。这会对matplotlib的功能产生任何副作用吗?我正在web服务器上运行matplotlib,所以这就是我的答案。我没有注意到一个错误
y副作用。重要说明:。导入pyplot之前需要调用use。因此,例如,如果您正试图导入pyplot,则需要先导入matplotlib,然后调用use,然后再导入pyplot。以上注释的解释如下。如何在.matplotlibrc中设置它?后端:agg in ~/.config/matplotlib'/matplotlibrc作为示例, seehttp://matplotlib.org/faq/troubleshooting_faq.htmllocating-matplotlib-config-dir. 另请参见,在页面底部有一个示例配置文件。在该页面上找到agg,您将看到所需的配置选项。有关参考,请参阅解释此问题的matplotlib文档+回答得很好,帮了我大忙!在我看来,这是一个优于公认的解决方案,尽管它没有直接回答问题,也回答了一个未提出的问题。这非常有效,不受导入matplotlib和其他库的顺序限制。在Spark上运行时,您必须限制它在头节点上运行,还是在工作节点上运行时可以运行?我在django项目中使用了它,这是唯一可以让它运行的方法。在这种情况下,第二种技术看起来是最优雅的。使用MPL后端为我解决了这个问题。绝对是最优雅的方式!
export MPLBACKEND="agg"
python <program_using_matplotlib.py>
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
import matplotlib.pyplot as plt.
plt.switch_backend('agg')
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()
multi_page(report_name)
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
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