Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ipywidgets:创建savefig按钮_Python_Matplotlib_Jupyter Notebook_Ipywidgets - Fatal编程技术网

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)