Matplotlib:在远程机器上显示图表
我有一段Python代码,它在一台叫做A的远程机器上进行一些计算。我是通过从另一台叫做B的机器上使用ssh
连接到A的。请问有没有办法把计算结果的图形显示在B上呢?
12 个回答
以下内容是我在本地机器(机器B)上使用Mac OS X,以及在远程机器(机器A)上使用Ubuntu时的经验。
要做到这一点,你的本地机器上需要安装X11服务器。
如果你使用的是较新的Mac OSX版本(比如OS X Mountain Lion或更新的版本),那么它是不会自带X11的(可以查看 http://support.apple.com/kb/ht5293)。你可以通过打开Mac的终端,运行命令 xterm
来检查是否有X11。如果打开了一个X11窗口,那就没问题。如果提示找不到命令,那就去 http://xquartz.macosforge.org/landing/ 安装X11服务器。安装完后,记得注销再重新登录你的Mac。
重新登录后,再次尝试运行 xterm
命令。应该能打开X11窗口。此时你的 $DISPLAY 变量也应该设置正确。如果没有设置,确保你在安装XQuartz的X11后进行了注销和重新登录。
echo $DISPLAY
/tmp/launch-I9I3aI/org.macosforge.xquartz:0
然后在你的本地机器上,使用 ssh -X 连接到远程机器A:
ssh -X user@machineA
接下来在远程机器上:
python
>>> import matplotlib
>>> matplotlib.use('GTKAgg') #I had to use GTKAgg for this to work, GTK threw errors
>>> import matplotlib.pyplot as plt #... and now do whatever you need...
确保在导入其他任何 matplotlib
的内容之前,先调用 matplotlib.use
(例如 matplotlib.pyplot
)。
关于使用 ssh -X 的其他有用的故障排除提示,可以参考这个链接: http://oroborosx.sourceforge.net/remotex.html#usessh
当然,你可以启用X11转发。通常在连接远程计算机时,可以通过在ssh
命令后面加上-X
或-Y
选项来实现。
ssh -X computerA
需要注意的是,计算机A上的SSH服务也必须配置为启用X11转发。这可以通过在计算机A的sshd_config
配置文件中添加
X11Forwarding yes
来完成。
如果计算机A的SSH服务没有启用X11转发,你可以让Python把计算结果写入一个文本文件,然后下载到计算机B上,再在本地使用Matplotlib进行处理。
如果你在远程机器(A)上使用Mac OS X的matplotlib,首先要确保你使用的是基于X11的显示方式,因为Mac OS X自带的显示方式无法把图表导出到其他显示器上。选择显示方式可以通过以下方式实现:
import matplotlib
matplotlib.use('GTK') # Or any other X11 back-end
你可以通过给use()
一个错误的显示方式名称来获取支持的显示方式列表:matplotlib会打印出一个错误信息,列出所有可能的显示方式。
然后可以使用ssh的X11转发功能来显示matplotlib的图表(具体可以参考David Z的回答)。