Виджет кнопки добавляет новые графики вместо замены старого

#python #matplotlib #jupyter-notebook #ipywidgets

#python #matplotlib #jupyter-ноутбук #ipywidgets

Вопрос:

У меня есть функция, использующая виджеты, которая работает просто отлично, но ползунок немного сложно перемещать небольшими шагами.

Я хочу добавить кнопки для перехода вперед или назад на один шаг по щелчку. Это реализовано в приведенном ниже коде. Моя проблема в том, что когда я перезваниваю исходную функцию myplot изнутри on_button_ , она снова рисует все, но мне нужен только обновленный точечный график.

Я экспериментировал с plt.close('all') и plt.show() , как вы можете видеть.

Моя проблема — я думаю — в том, что я не могу найти подходящее место для их размещения.

 import ipywidgets as widgets
from ipywidgets import interact, interact_manual, Button, HBox, fixed

@interact 

step = 0.1
def myplot(
            x=(0.3, 3, step), 
            y=(0,8,1)):
  
        

    ###############
    def on_button_next(b):
        plt.close('all')
        myplot(x step, y=y)

    def on_button_prev(b):
        plt.close('all')
        myplot(x-step, y=y)

    button_next = Button(description='x ')
    button_prev = Button(description='x-')
    ############################

    if x>0.3 :  
        plt.figure(figsize=(9,7))
        ax1 = plt.subplot()
        ax1.scatter(x, y, marker='*', s=300)
        ax1.set_xlim(0,2)
        ax1.set_ylim(0,8)


        ##### buttons. 
        display(HBox([button_prev, button_next]))
        button_next.on_click(on_button_next)
        button_prev.on_click(on_button_prev)
        ################

    return plt.show()
  

Ответ №1:

Решаемая путем удаления plt.show() и plt.close() и записи вместо display(fig) и clear_output()

 from IPython.display import clear_output

step=0.1

@interact 

def myplot(
            x=(0.3, 3, step), 
            y=(0,5,1)):

        

#         ##############
    def on_button_next(b):
        clear_output()
        myplot(x step, y=y)
    def on_button_prev(b):
        clear_output()
        myplot(x-step, y=y)

    button_next = Button(description='x ')
    button_prev = Button(description='x-')

    ##############
    if x>0.3 :  
        
        #buttons
        
        display(HBox([button_prev, button_next]))
        button_next.on_click(on_button_next)
        button_prev.on_click(on_button_prev)
        ##
        
        fig = plt.figure()
        plt.scatter(x, y, marker='*', s=300)
        plt.xlim(0.3,2)
        plt.ylim(0,8)
        plt.close()
        display(fig)