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交互式小部件生成方波,可以实时调节谐波个数和基波频率