Python ipywidgets:创建savefig按钮
我正在尝试从Python ipywidgets:创建savefig按钮,python,matplotlib,jupyter-notebook,ipywidgets,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 %matplot
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)
问题是每次调用
plotfields
函数时,都会创建一个回调;它被多次调用,每次移动一个滑块。因此,将
按钮移动是有意义的。单击时(单击按钮时)
在重复调用的函数之外。然后我将使用
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)