在运行matplotlib交互式nbagg的Linux虚拟机上使用IPython Notebook

7
我希望在我的IPython笔记本中显示按钮和其他交互式matplotlib对象。screenshot
这是我所做的:
  1. 安装了http://datasciencetoolbox.org,它是一个带有ipython和版本为1.3.1的matplotlib的vagrant box。

  2. 我需要升级matplotlib到最新版本,因为它具有内联交互式绘图的功能。Matplotlib 1.4.1的新功能
    我需要运行sudo apt-get install pkg-config
    sudo pip install matplotlib --upgrade才能进行。

  3. 然后,为了生成下面漂亮(即无错误)的截图,我进入.ipython/dst-profile/ipython_notebook_config.py文件并删除了关于IPKernelApp.pylab='inline'的行,以便运行matplotlib.use('nbagg')命令。

  4. 然后我就能创建下面的截图了。但是,事情看起来仍然很糟糕。那些按钮不是真正的按钮。那是按钮的图像。请指导如何使这些按钮活起来!

哦…如果这能帮助你帮助我,那么请查看this

谢谢!

screenshot


另外,如果你只是针对笔记本进行交互式绘图,那么使用@interact可能会更好,它是一种黑魔法,可以为你创建一个JavaScript小部件来实现交互。 - tacaswell
@tcaswell,我应该如何使用@interact? - user3659451
查阅文档,我从未真正使用过它,只看过演示。 - tacaswell
也许现在我暂时不需要。不过我会记在心里的。谢谢。升级很棒。 - user3659451
1个回答

8
基本上你面临两个问题:
1. `%pylab inline` 调用覆盖了 `matplotlib.use('nbagg')` 调用,使用内联后端而不是你实际想要的 nbagg 后端。如果你使用 IPython 的最新版本 (2.3),你可以直接使用 `%matplotlib nbagg` (或 `%matplotlib notebook`)来加载 nbagg 后端,而不是使用 `%pylab`。
2. 一旦你启用了 nbagg 后端,你需要显式地显示它,即在脚本末尾添加一个 `plt.show()` 调用 -> 更新:在 IPython 2.3.1 中不再需要这样做(感谢 @tcaswell 的提示)
有了这个,你就可以在 IPython 笔记本中嵌入交互式 matplotlib 体验。但是,对你的代码进行快速尝试并没有产生期望的结果。按钮会响应并执行回调,但 `print` 调用没有显示任何内容。无论如何,为了看到它是否工作,请尝试以下简单示例(需要 IPython 2.3):
%matplotlib nbagg
from matplotlib.widgets import Button
import matplotlib.pyplot as plt
def callback(event):
    plt.text(event.xdata, event.ydata, 'clicked')

f,a = plt.subplots(1)
b1 = Button(a,'Button1')
b1.on_clicked(callback)
plt.show()

顺便提一下,强烈建议使用%matplotlib而不是%pylab,因为后者会导致一些副作用,请参见这里


需要显式调用show的问题应该通过升级mpl/ipython的某种组合来解决,但我不确定到什么程度(请参见https://github.com/ipython/ipython/pull/6587)。赞成不使用pylab,我们实际上无法从源代码中删除它,但正在努力从文档中清除它(包括mpl + IPython)。 - tacaswell
我已经升级了ipython,自从这篇原始帖子发布以来:https://www.dropbox.com/s/co17ndyts0v8a4q/Screenshot%202014-11-13%2013.04.15.png?dl=0,然后我编辑了我的笔记本配置文件。https://www.dropbox.com/s/ox1i4k5vl355e06/Screenshot%202014-11-13%2013.14.30.png?dl=0最后,我启动了一个新的笔记本,并运行了您的代码,没有第一行和最后一行(因此没有plt.show()):https://www.dropbox.com/s/wyy0wosbkupnbtg/Screenshot%202014-11-13%2013.18.14.png?dl=0 - user3659451
这样就解决了tcaswell的plt.show问题,并且解决了我花费超过5个小时调试的问题。现在我终于可以使用带有交互式图形的ipython笔记本了!耶。谢谢@Jakob。 - user3659451

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