我正在尝试使用widget events制作互动图表。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import ipywidgets as widgets
def myplot(n):
x = np.linspace(-5, 5, 30)
y = x**n
fig, ax = plt.subplots(nrows=1, ncols=1);
ax.plot(x, y)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()
Interact按预期工作(它以交互方式更改数字):
widgets.interact(myplot, n=(0,5));
但是,以下代码段会在您与滑块交互时创建下面显示的几个数字。
n_widget = widgets.IntSlider(
value=2,
min=0,
max=5)
def on_value_change(change):
myplot(n=n_widget.value)
n_widget.observe(on_value_change)
display(n_widget)
我可以像使用widgets.interact()一样更新绘图吗?
我当前的安装是使用conda和Python 3.6(Windows机器)。
ipywidgets 7.1.0
jupyter 1.0.0
jupyter_client 5.2.1
jupyter_console 5.2.0
jupyter_core 4.4.0
matplotlib 2.1.1
notebook 5.3.1
numpy 1.14.0
答案 0 :(得分:3)
请注意,以下是ipywidgets版本的工作解决方案< 7.0。对于ipywidgets> = 7.0的解决方案,请参阅this GitHub issue。
虽然在许多简单的情况下plt.show()
可以很好地替换单元格的输出,但情况并非总是如此。在Jupyter中使用交互式元素时,使用IPython.display.display
通常更有帮助。
在这里,您可能不希望为每次互动创建新的情节。而只是将新数据设置到图中就足够了。然后,您可以自动缩放新数据的图表并显示图形。一旦显示新数字,您可以使用IPython.display.clear_output
清除输出。这样可确保输出单元格中始终存在单个图,而与interact
或observe
的使用无关。
def myplot(n):
line.set_ydata(x**n)
ax.relim()
ax.autoscale()
display(fig)
clear_output(wait=True)
Comlpete笔记本:
# cell 1
%%capture
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display, clear_output
import ipywidgets as widgets
fig, ax = plt.subplots(nrows=1, ncols=1);
x = np.linspace(-5, 5, 30)
y = x**0
line, = ax.plot(x, y)
ax.set_xlabel('x')
ax.set_ylabel('y')
def myplot(n):
line.set_ydata(x**n)
ax.relim()
ax.autoscale()
display(fig)
clear_output(wait=True)
#cell2
widgets.interact(myplot, n=(0,5));
#cell3
n_widget = widgets.IntSlider(
value=2,
min=0,
max=5)
def on_value_change(change):
myplot(n=n_widget.value)
n_widget.observe(on_value_change)
display(n_widget)