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

2024-12-12 08:40:00
admin
原创
123
摘要:问题描述:我正在尝试将 networkx 与 Python 结合使用。当我运行此程序时,出现此错误。是否缺少了什么?#!/usr/bin/env python import networkx as nx import matplotlib import matplotlib.pyplot import ma...

问题描述:

我正在尝试将 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

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

#!/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-using 后端。我刚刚在我的其中一台服务器上遇到了同样的问题。对我来说,解决方案是在任何其他 pylab/matplotlib/ pyplot导入之前读取的位置添加以下代码:

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

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

解决方案 2:

只是作为 Reinout 回答的补充。

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

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

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

解决方案 3:

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

准备执行环境的第一个技巧是使用matplotlibrc文件,正如 Chris Q. 明智推荐的那样,设置

backend : Agg

在该文件中。您甚至可以控制 — 无需更改代码 — matplotlib 如何以及在何处查找和找到该matplotlibrc文件。

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

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

这很方便,因为您甚至不必在磁盘上提供另一个文件即可完成此操作。例如,我已采用此方法进行持续集成测试,并在没有显示器的远程机器上运行。

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

解决方案 4:

我在通过 Spark 使用 matplotlib 时遇到错误。matplotlib.use('Agg')对我来说不起作用。最后,以下代码对我有用。更多信息请见此处

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

解决方案 5:

我只是重复@Ivo Bosticky 所说的内容,这些内容可以忽略。将这些行放在py 文件的最开头。

import matplotlib
matplotlib.use('Agg') 

或者会出错

*/usr/lib/pymodules/python2.7/matplotlib/__init__.py:923:UserWarning:对 matplotlib.use() 的调用无效
因为后端已经被选择了;
matplotlib.use() 必须在 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

解决方案 7:

当登录服务器执行代码时请使用以下命令:

ssh -X username@servername

-X将消除没有显示名称和没有 $DISPLAY 环境变量的错误

:)

解决方案 8:

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

它对我有用。

解决方案 9:

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

export DISPLAY=localhost:0

解决方案 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 机器学习引擎:

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)

解决方案 13:

import matplotlib
matplotlib.use('Agg')

只要我直接调用绘图函数/代码,它对我来说就有效。但是如果你使用

from joblib import Parallel, delayed

Parallel以及delayed用于并行化代码的模块,那么你需要添加

matplotlib.rcParams.update({'backend': 'Agg'})

在您的函数内部添加一行以使agg后端可以工作。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用