我正在尝试从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)
答案 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)