如何在本地机器上显示matplotlib图形?

3 投票
3 回答
3085 浏览
提问于 2025-04-18 18:09

我在远程服务器上运行ipython,通过serveraddress:8888/等地址来访问,写我的笔记代码。

当我使用matplotlib的时候,图表当然是直接显示在笔记本里的。有没有办法把数据远程发送,这样图表窗口就能在我本地打开?我希望在本地机器上有完整的matplotlib交互环境,而所有的计算都在服务器上进行。这是个很基础的需求……但我在谷歌上找了很久还是搞不明白。

3 个回答

0

你想要一个可以放大缩小的普通图表窗口,对吧?我觉得在同一个内核中你是做不到的,因为不幸的是,你不能在已经选择了后端的情况下从内联模式切换到qt模式。你对matplotlib.use()的调用总是在pylab之前。

6

即将发布的版本(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的增量数据。

3

这里有几种可能的解决方案:

  1. 如果你的远程机器是类似Unix的系统,你可以使用X Windows(这样你的操作是在远程机器上,但显示在本地机器上)。

  2. mpld3

  3. bokeh和iPython笔记本。

  4. matplotlibnbagg后端。

第一种方案需要你在自己的机器上有一个X服务器,并且两台机器之间要有连接(可能通过ssh等方式进行隧道连接)。所以,这个方案依赖于操作系统,并且性能也取决于两台机器之间的连接情况。

第二和第三种方案虽然很新,但前景不错。它们的实现方式有很大不同,mpl3d可以使用标准的matplotlib绘图命令,但如果数据量很大,bokeh可能会更有用。

第四种方案可能是最理想的解决办法(可以参考tcaswell的评论),但目前还需要使用matplotlib的开发版本(也就是说,安装可能会有一些挑战)。不过,如果你能耐心等一周,1.4.0版本就会发布了。

撰写回答