【问题标题】:Python ipywidgets: create a savefig buttonPython ipywidgets:创建一个 savefig 按钮
【发布时间】:2018-01-21 10:53:33
【问题描述】:

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

【问题讨论】:

    标签: python matplotlib jupyter-notebook ipywidgets


    【解决方案1】:

    问题是每次调用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)
    

    【讨论】:

    • @kommandoking:看到你在方法plotfields(p,a) 中添加了X,Y:很好,但是代码更正应该首先作为注释。你不知道作者的意图。让他们有机会自己修复或解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多