Jupyter Notebook:带有小部件的交互式绘图

Posted

技术标签:

【中文标题】Jupyter Notebook:带有小部件的交互式绘图【英文标题】:Jupyter Notebook: interactive plot with widgets 【发布时间】:2017-11-03 20:57:35 【问题描述】:

我正在尝试生成依赖于小部件的交互式绘图。 我遇到的问题是,当我使用滑块更改参数时,会在前一个绘图之后完成一个新绘图,而我希望只有一个绘图会根据参数发生变化。

示例:

from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np

def plot_func(freq):
    x = np.linspace(0, 2*np.pi)
    y = np.sin(x * freq)
    plt.plot(x, y)

interact(plot_func, freq = widgets.FloatSlider(value=7.5,
                                               min=1,
                                               max=5.0,
                                               step=0.5))

将滑块移动到 4.0 后,我有:

虽然我只想在移动滑块时改变一个数字。 我怎样才能做到这一点?

(我使用的是 Python 2.7、matplotlib 2.0,我刚刚将 notebook 和 jupyter 更新到了最新版本。如果需要更多信息,请告诉我。)

【问题讨论】:

【参考方案1】:

由于您要更改图形,而不是创建新图形,我建议您采用以下方式:

    使用交互式后端; %matplotlib notebook 更新绘图中的线条,而不是绘制新线条。

所以代码可能看起来像这样:

%matplotlib notebook
from ipywidgets import *
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
line, = ax.plot(x, np.sin(x))

def update(w = 1.0):
    line.set_ydata(np.sin(w * x))
    fig.canvas.draw_idle()

interact(update);

您也可以使用plt.show(),如this answer。

【讨论】:

为什么line后面有个逗号?在线line, = ax.plot(x, np.sin(x)) @BorisYakubchik 见is this trailing comma the comma operator? @ImportanceOfBeingErnest 当我单击小部件并尝试滑动它时,它就会消失。知道为什么吗? Jupyter 版本信息:笔记本服务器版本为 4.3.1,运行于 Python 3.6.6、IPython 5.1.0 @vestland 我刚刚使用 Python 3.6.6、jupyter core 4.4.0、笔记本服务器 5.6.0、jupyter_client 5.2.3、jupyter_console 5.2.0、Ipython 6.5.0、ipywidgets 7.4.2 进行了测试(不确定此处的相关内容),并且可以按预期工作。 对我来说,fig.canvas.draw_idle() 效果更好,因为快速的参数变化不会留下 ghost 图。【参考方案2】:

这是最新版本的 jupyter 和/或 ipywidgets 中引入的问题 (?)。我发现的一种解决方法是在plot_func 的末尾添加行plt.show()

【讨论】:

这将为每个 silder 更新创建一个新人物,对吗?那么,它似乎是所有解决方案中效率最低的? @ImportanceOfBeingErnest 为每个滑块更新创建一个新图形显然效率不高。你的方法是(+1)。我只添加了这个答案,因为它解决了 OP 的(低效)方法的问题。 TBH,我确实发现这种低效的方法更方便快速而肮脏地查看函数的属性。 我明白了,也许您将这个论点添加到答案中?

以上是关于Jupyter Notebook:带有小部件的交互式绘图的主要内容,如果未能解决你的问题,请参考以下文章

利用python和jupyter notebook交互式小部件生成方波,可以实时调节谐波个数和基波频率

Jupyter 交互式小部件未正确执行

在 jupyter notebook 中使用 plotly python 绘制具有不等热图的交互式树状图

决策树决策树与Jupyter小部件的交互式可视化

jupyter notebook中使用mpld3进行交互

Gtk Notebook 小部件添加新标签错误