如何用pylab远程保存图形?

78 投票
2 回答
39211 浏览
提问于 2025-04-16 10:03

我正在尝试在远程计算机上生成一个图形,使用的命令是 pylab.savefig。但是我遇到了这样的错误:

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

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

2 个回答

1

试着把DISPLAY这个变量设置成合适的值。

通过网络使用X11来显示图形时,远程计算机需要有一个DISPLAY环境变量,这个变量告诉它在哪里显示图形。通常这个值会像这样:mydesktop.example.com:0.0。然后,当一个X11程序想要绘制东西时,它会通过网络发送到mydesktop.example.com,也就是你面前的那台机器(X服务器),然后图形就会显示出来。

如果你面前的机器是Windows系统,那么你需要从某个地方获取一个X服务器,比如cygwin/X11或者商业软件eXceed,这些都可以。

你还需要确保安全性问题,因为你不能让任何人都能通过网络在你的屏幕上写东西。

你是怎么连接到远程机器的?如果你是从一台Linux电脑连接到另一台Linux电脑,使用ssh的话,简单的解决办法可能就是用'ssh -X foo.example.com'来连接,这样可以通过本地的socket来传输X11连接。

所以,如果ssh -X不是答案的话,能不能提供更多关于操作系统的信息呢?

153

默认情况下,matplotlib会使用类似于TkAgg的后端。这需要一个X服务器在运行。

虽然你可以使用X转发,但在matplotlib尝试连接远程X服务器时,会有明显的延迟。如果你不需要与图形进行交互,通常可以通过完全避免X连接来加快速度,这样会更好。

如果你想在完全不需要X服务器的情况下绘制图形,可以使用Agg 后端

例如,可以这样做:

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后端。

有关更多信息,请查看这篇文章

撰写回答