Anton Ovsyannikov
Anton Ovsyannikov

Reputation: 1200

Jupyter: How to update plot on button click (ipywidgets)

I am using Jupyter and trying to make my plots interactive.

So I have a plot. I have a ipywidgets button.

On button click I need to update plot, like interact do with sliders.

But I can't.

It works only if matplotlib uses 'notebook' backend, but it looks terrible. At same time interact works with any kind of plots. Are there any way to reproduce this, not using interact?

#this works fine! But toolbar near the graph is terible
#%matplotlib notebook 

#this does not work
%matplotlib inline

from matplotlib.pyplot import *
button = ipywidgets.Button(description="Button")

def on_button_clicked(b):
    ax.plot([1,2],[2,1])

button.on_click(on_button_clicked)

display(button)

ax = gca()
ax.plot([1,2],[1,2])
show()

Upvotes: 7

Views: 14654

Answers (1)

Anton Ovsyannikov
Anton Ovsyannikov

Reputation: 1200

As workaround we can repaint the whole plot to Output widget and then display it without flickering.

%matplotlib inline

from matplotlib.pyplot import *

button = ipywidgets.Button(description="Button")
out = ipywidgets.Output()

def on_button_clicked(b):
    with out:
        clear_output(True)
        plot([1,2],[2,1])
        show()

button.on_click(on_button_clicked)

display(button)

with out:
    plot([1,2],[1,2])
    show()

out

Upvotes: 8

Related Questions