Python:从 Ipywidget 按钮重置 Matplotlib

Nov*_*vak 5 python-2.7 jupyter-notebook

在 Jupyter notebook 中使用 iPyWidgets 和 Matplotlib 时,即使有多个子图和多个带有多个滑块的变量,也很容易获得实时更新的图形。只需设置 aninteract以包含激活的绘图函数,以及两个滑块变量的构造函数:

%pylab inline
from ipywidgets import *
from IPython.display import display
import numpy as np
import matplotlib

t = np.arange(0.0, 4*pi, 0.01)

def pltsin(f1, f2):
    ax11 = plt.subplot(121)
    ax11.set_title('Plot 1')
    ax11.plot(t, sin(2*pi*t*f1/4/pi), 'k'); ax11.grid(True)
    ax11.plot(t, cos(2*pi*t*f1/4/pi), 'r'); ax11.grid(True)

    ax12 = plt.subplot(122)
    ax12.set_title('Plot 2')
    ax12.plot(t, sin(2*pi*t*f2/4/pi), 'k'); ax12.grid(True)
    ax12.plot(t, cos(2*pi*t*f2/4/pi), 'r'); ax11.grid(True)

    plt.show()

interact(pltsin, f1 = (1, 2, 0.01), f2 = (1, 2, 0.01))
Run Code Online (Sandbox Code Playgroud)

这可以很容易地扩展到一个图,其中(比如)三个滑块在一个窗口中控制三个多项式系数(即,没有子图)。

但是,有一个重置按钮将非常有用,它将所有变量返回到它们的默认状态。如何使 ipywidget 按钮的 on_click 方法影响滑块的变量和图形本身?

Jam*_*per 4

这可以通过利用交互功能来完成。

%pylab inline
from ipywidgets import widgets
from IPython.display import display
import numpy as np
import matplotlib

t = np.arange(0.0, 4*pi, 0.01)

def pltsin(f1, f2):
    ax11 = plt.subplot(121)
    ax11.set_title('Plot 1')
    ax11.plot(t, sin(2*pi*t*f1/4/pi), 'k'); ax11.grid(True)
    ax11.plot(t, cos(2*pi*t*f1/4/pi), 'r'); ax11.grid(True)

    ax12 = plt.subplot(122)
    ax12.set_title('Plot 2')
    ax12.plot(t, sin(2*pi*t*f2/4/pi), 'k'); ax12.grid(True)
    ax12.plot(t, cos(2*pi*t*f2/4/pi), 'r'); ax11.grid(True)

    plt.show()

def reset_values(b):
    """Reset the interactive plots to inital values."""
    my_plts.children[0].value = 1
    my_plts.children[1].value = 1

reset_button = widgets.Button(description = "Reset")
reset_button.on_click(reset_values)

my_plts = widgets.interactive(pltsin, f1 = (1, 2, 0.01), f2 = (1, 2, 0.01))
display(my_plts, reset_button)
Run Code Online (Sandbox Code Playgroud)

无法忍受硬编码变量?reset_values然后用这个更有弹性的版本替换该函数:

def reset_values(b):
    """Reset the interactive plots to inital values."""

    my_plts.children[0].value = my_plts.children[0].min
    my_plts.children[1].value = my_plts.children[1].min
Run Code Online (Sandbox Code Playgroud)

希望有帮助。