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

kri*_*itx 309 python graph matplotlib

我正在尝试将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
Run Code Online (Sandbox Code Playgroud)

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

#!/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")
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)

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

#!/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")
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)

Rei*_*ees 510

主要问题是(在您的系统上)matplotlib默认选择x-using后端.我在我的一台服务器上遇到了同样的问题.我的解决方案是在以下任何其他pylab/matplotlib/pyplot导入之前读取的地方添加以下代码:

import matplotlib
# Force matplotlib to not use any Xwindows backend.
matplotlib.use('Agg')
Run Code Online (Sandbox Code Playgroud)

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

  • 重要说明:.在导入pyplot之前需要调用.use.例如,如果您只是尝试导入pyplot,则需要首先导入matplotlib,调用use,然后导入pyplot. (179认同)
  • `〜/ .config/matplotlib'/ matplotlibrc`中的`backend:agg`(例如,参见http://matplotlib.org/faq/troubleshooting_faq.html#locating-matplotlib-config-dir).另请参见http://matplotlib.org/users/customizing.html,它在页面底部有一个示例配置文件.在该页面上找到"agg",您将看到所需的配置选项. (18认同)
  • 上述评论更多地通过[此答案](http://stackoverflow.com/a/4706614/1959808)进行了解释. (8认同)
  • 作为参考,[这里是链接](http://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server)到matplotlib文档解释了这一点.(+1,很棒的答案,完美地帮助了我!) (4认同)
  • 你如何"在你的.matplotlibrc中设置它"? (2认同)

Chr*_*s.Q 71

就像Reinout的回答一样.

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

>>> import matplotlib
>>> matplotlib.matplotlib_fname() # This is the file location in Ubuntu '/etc/matplotlibrc'
Run Code Online (Sandbox Code Playgroud)

然后将该文件中的后端修改为backend : Agg.这就对了.

  • 专业提示:将`$ MATPLOTLIBRC`设置为*目录*,您要在其中放置自己的matplotlibrc. (5认同)

got*_*nes 42

干净的答案是花一点时间正确准备您的执行环境.

准备执行环境的第一个技术是使用Chris Q.明智推荐matplotlibrc文件设置

backend : Agg
Run Code Online (Sandbox Code Playgroud)

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

您必须准备执行环境的第二种技术是使用MPLBACKEND环境变量(并通知您的用户使用它):

export MPLBACKEND="agg"
python <program_using_matplotlib.py>
Run Code Online (Sandbox Code Playgroud)

这很方便,因为您甚至不必在磁盘上提供另一个文件来使其工作.我采用这种方法,例如,在持续集成中进行测试,并在没有显示器的远程机器上运行.

在你的Python代码中将你的matplotlib后端硬编码为"Agg"就好像用一把大锤子将一个方形钉子钉入一个圆孔中,相反,你可能只是告诉matplotlib它需要是一个方孔.


use*_*611 38

我通过Spark使用matplotlib时出错了.matplotlib.use('Agg')不适合我.最后,以下代码适用于我.更多这里

import matplotlib.pyplot as plt.
plt.switch_backend('agg')
Run Code Online (Sandbox Code Playgroud)


Som*_*mum 31

我将重复@Ivo Bosticky所说的可以忽略的内容.把这些行放在py文件的非常开头.

import matplotlib
matplotlib.use('Agg') 
Run Code Online (Sandbox Code Playgroud)

或者一个人会得到错误

*/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,*

这将解决所有显示问题


小智 14

登录服务器执行代码时请改用:

ssh -X username@servername
Run Code Online (Sandbox Code Playgroud)

-X将摆脱没有显示名称并且没有$ DISPLAY环境变量错误

:)


Mat*_*123 14

我发现在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
Run Code Online (Sandbox Code Playgroud)


Mic*_*yan 5

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

export DISPLAY=localhost:0
Run Code Online (Sandbox Code Playgroud)


小智 5

import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt

这个对我有用。