如何在本地机器上显示matplotlib图形?
我在远程服务器上运行ipython,通过serveraddress:8888/等地址来访问,写我的笔记代码。
当我使用matplotlib的时候,图表当然是直接显示在笔记本里的。有没有办法把数据远程发送,这样图表窗口就能在我本地打开?我希望在本地机器上有完整的matplotlib交互环境,而所有的计算都在服务器上进行。这是个很基础的需求……但我在谷歌上找了很久还是搞不明白。
3 个回答
你想要一个可以放大缩小的普通图表窗口,对吧?我觉得在同一个内核中你是做不到的,因为不幸的是,你不能在已经选择了后端的情况下从内联模式切换到qt模式。你对matplotlib.use()
的调用总是在pylab
之前。
即将发布的版本(1.4.0,预计在2014年8月底推出,目前有候选版本可用)将会包含一个叫做nbagg
的后端,这个后端可以让你在不需要使用本地客户端或d3的情况下,创建互动图形。你在笔记本中只需要做以下操作:
import matplotlib
matplotlib.use('nbagg')
from matplotlib import pyplot as plt
然后就可以绘图了
plt.plot(range(3))
plt.show()
如果你想现在就试试,可以从源代码构建,或者查看其中一个候选版本。
使用nbagg
和mpld3/bokeh之间有两个主要区别。
首先,你不需要跨库接口(也就是说,不用学习JavaScript!)。我的理解是,这两个库都会创建一个图形,然后再处理它(这并不是很完美,因为mpl在设计时并没有考虑到这一点)。使用nbagg时,鼠标和键盘的操作可以直接使用,不需要转换,我认为目前它们无法导出到d3。
第二个区别是,使用nbagg时,所有的渲染都发生在服务器上,而基于d3的库则需要将所有数据直接发送到浏览器(bokeh正在努力让这个过程更智能,只发送你能看到的有用分辨率的数据)。使用nbagg
时,网络上只传输png的增量数据。
这里有几种可能的解决方案:
如果你的远程机器是类似Unix的系统,你可以使用X Windows(这样你的操作是在远程机器上,但显示在本地机器上)。
mpld3
bokeh
和iPython笔记本。matplotlib
的nbagg
后端。
第一种方案需要你在自己的机器上有一个X服务器,并且两台机器之间要有连接(可能通过ssh等方式进行隧道连接)。所以,这个方案依赖于操作系统,并且性能也取决于两台机器之间的连接情况。
第二和第三种方案虽然很新,但前景不错。它们的实现方式有很大不同,mpl3d
可以使用标准的matplotlib
绘图命令,但如果数据量很大,bokeh
可能会更有用。
第四种方案可能是最理想的解决办法(可以参考tcaswell
的评论),但目前还需要使用matplotlib
的开发版本(也就是说,安装可能会有一些挑战)。不过,如果你能耐心等一周,1.4.0版本就会发布了。