如何使用pylab远程保存图形?

78

我正在尝试使用命令pylab.savefig在远程计算机上生成一张图像。但是出现了如下错误:

Unable to access the X Display, is $DISPLAY set properly?

我该如何正确地保存这个图形?


1
相关链接:https://dev59.com/1HE85IYBdhLWcg3wYicB?lq=1 - 0 _
2个回答

153
默认情况下,matplotlib将使用类似于TkAgg的后端。这需要运行X服务器。 虽然您可以使用X转发,但由于matplotlib尝试连接远程X服务器,因此会有明显的延迟。如果您不需要与绘图交互,则通常最好通过完全避免X连接来加速事情。 如果要制作一个不需要X服务器的图,请改用Agg backend。 例如,执行以下操作:
import matplotlib
matplotlib.use('Agg') # Must be before importing matplotlib.pyplot or pylab!
import matplotlib.pyplot as plt

fig = plt.figure()
plt.plot(range(10))
fig.savefig('temp.png')

如果您希望这成为默认行为,可以修改您的matplotlibrc文件,将Agg后端设置为默认值。
请参阅此文章获取更多信息

2
我和gerry遇到了同样的问题。对我来说,仅有Joe的窍门是不够的,我还需要执行ssh -X nos@server.com而不仅仅是ssh命令。 - nos
matplotlib.use('Agg') 对我没有起作用,但是在 matplotlibrc 文件中将后端默认更改为 Agg(位于 /usr/local/lib/python2.7/dist-packages/matplotlib/mpl-data/matplotlibrc)对我有用。 - Orlando
1
仍然出现运行时错误 :( 文件 "/home/user/anaconda2/lib/python2.7/site-packages/matplotlib/backends/backend_qt5.py",第138行,_create_qApp函数中, 抛出RuntimeError异常:无效的DISPLAY变量。 - Hana90
1
@Hana90:matplotlib.use 只能在任何方式导入 matplotlib.pyplot 之前使用。你是否已经导入了 pyplot?这包括像 pylab 或其他导入 pyplot 的库。它还包括活动的 ipython 会话,或者如果你设置了任何自动导入。尝试从命令行中使用裸露的 python 运行一个最小的示例。 - Joe Kington
谢谢,我需要连接ssh -X服务器。谢谢。 - Hana90
  1. 查找matplotlibrc文件的位置
python >>>import matplotlib >>>matplotlib.matplotlib_fname() '/path/to/matplotlib/matplotlibrc'
  1. 编辑matplotlibrc文件
查找 -> backend : Tkagg 替换为 -> backend : Agg
- Wael

1

尝试将DISPLAY变量设置为适当的值。

使用X11通过网络进行图形处理的方式是,客户端(远程)计算机具有一个DISPLAY环境变量,指示在哪里绘制图形。通常它会是类似于mydesktop.example.com:0.0这样的东西 - 然后当X11程序尝试绘制某些内容时,它会通过网络传输到mydesktop.example.com,这是您坐在面前的机器(X服务器),然后弹出窗口。

现在,如果您面前的机器是Windows,则需要从某个地方获取X服务器 - cygwin/X11或商业eXceed都可以胜任。

您还需要确保安全性得到处理 - 您不能让任何人通过网络写入您的屏幕。

您是如何连接到远程机器的?因为如果您从Linux桌面连接到另一台Linux桌面,则简单的解决方案可能是“使用ssh -X foo.example.com”进行连接 - 这会将X11连接通过本地套接字传输。

因此,如果ssh -X不是答案,我们可以了解一下涉及的操作系统的更多信息吗?


1
谢谢您的解释。我正在Windows下ssh到Linux机器。是否可以在没有X11的情况下制作图形? - gerry
不要让它出现在屏幕上 - 你需要让pylab将其写入文件,然后将该文件复制到Windows桌面。也许可以尝试一下http://winswitch.org/ - 这是一个易于使用的跨平台图形界面工具。 - Spacedman
我在我的Linux机器上执行了“ssh -X username@servername”命令,连接到另一台Linux机器,并且成功运行。 - Mahshid Zeinaly
你好,Spacedman。我有一个绘图方面的问题需要请教专家,像您这样的人。请看一下这个链接:http://stackoverflow.com/questions/36248016/how-to-get-more-information-in-2nd-plot-by-clicking-1st-plot-using-python-clicki。谢谢! - user2768702

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接