Python ipywidgets:创建一个savefig按钮

时间:2018-01-21 10:53:34

标签: python matplotlib jupyter-notebook ipywidgets

我正在尝试从ipywidgets.Button实例创建一个按钮,该按钮会在按下后保存特定的数字。但是,一旦按下按钮,使用以下Ipython笔记本可以节省多个文件:

import numpy as np
from ipywidgets import interact, interactive,FloatSlider,IntSlider,Button
from IPython.display import display
import matplotlib.pylab as plt
%matplotlib inline
button = Button(description="Savefig")
display(button)
def plotfields(p,a):
    fig,ax = plt.subplots(1,2,figsize=(4*2,4),sharey=True)
    X,Y=np.meshgrid(np.linspace(0,100,100),np.linspace(0,100,100))
    b1 = np.sin(p*X)*np.cos(a*Y)
    b2 = np.sin(a*X)*np.cos(p*Y)
    ax[0].imshow(b1,aspect='auto')
    ax[1].imshow(b2,aspect='auto')
    ax[0].set_ylabel(r'$t$')
    ax[0].set_xlabel(r'$x$')
    ax[1].set_xlabel(r'$x$')
    plt.tight_layout()
    def on_button_clicked(b):
        fig.savefig("test_p{:.3s}_a{:.3s}.eps".format(str(int(100*p)),str(int(100*a))))
        fig.savefig("test_p{:.3s}_a{:.3s}.png".format(str(int(100*p)),str(int(100*a))))
    button.on_click(on_button_clicked)

p_w  = FloatSlider(min=0.01, max=1, step=0.01, value=0.01)
a_w  = FloatSlider(min=0.01, max=1, step=0.01, value=0.01)
interact(plotfields,p=p_w,a=a_w)

1 个答案:

答案 0 :(得分:2)

问题是每次调用plotfields函数时都会创建一个回调函数;每次移动其中一个滑块时,它会被调用很多次 因此,将button.on_click(on_button_clicked)移到重复调用的函数之外是有意义的 然后我会使用display来显示图形。

%%capture
import numpy as np
from ipywidgets import interact, interactive,FloatSlider,IntSlider,Button
from IPython.display import display
import matplotlib.pylab as plt
%matplotlib inline
button = Button(description="Savefig")
display(button)

params = [0.01,0.01]

def init():
    fig,ax = plt.subplots(1,2,figsize=(4*2,4),sharey=True)
    X,Y=np.meshgrid(np.linspace(0,100,100),np.linspace(0,100,100))
    b1 = np.sin(params[0]*X)*np.cos(params[1]*Y)
    b2 = np.sin(params[1]*X)*np.cos(params[0]*Y)
    im1 = ax[0].imshow(b1,aspect='auto')
    im2 = ax[1].imshow(b2,aspect='auto')
    ax[0].set_ylabel(r'$t$')
    ax[0].set_xlabel(r'$x$')
    ax[1].set_xlabel(r'$x$')
    plt.tight_layout()
    return fig, im1, im2

fig, im1, im2 = init();

def plotfields(p,a):
    params[0] = p; params[1] = a
    b1 = np.sin(params[0]*X)*np.cos(params[1]*Y)
    b2 = np.sin(params[1]*X)*np.cos(params[0]*Y)
    im1.set_data(b1)
    im2.set_data(b2)
    display(fig)

def on_button_clicked(b):
    fig.savefig("test_p{:.3s}_a{:.3s}.eps".format(str(int(100*params[0])),str(int(100*params[1]))))
    fig.savefig("test_p{:.3s}_a{:.3s}.png".format(str(int(100*params[0])),str(int(100*params[1]))))
button.on_click(on_button_clicked)

p_w  = FloatSlider(min=0.01, max=1, step=0.01, value=0.01)
a_w  = FloatSlider(min=0.01, max=1, step=0.01, value=0.01)
interact(plotfields,p=p_w,a=a_w)