6

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()
Anton Ovsyannikov
  • 1,010
  • 1
  • 12
  • 30

1 Answers1

8

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
Anton Ovsyannikov
  • 1,010
  • 1
  • 12
  • 30
  • I wonder if you are aware of the fact that a plot with inline backend is nothing else than a png image. So, I would not call this a workaround, but it is simply one way of doing things: generate a new png image and replace the old one with it. For true interactivity within the plot the inline backend is not the method of choice - that is why people usually use the notebook backend for such interactions. – ImportanceOfBeingErnest Dec 19 '17 at 10:20
  • Yes, it's ok. Moreover it's what I was trying to achieve - on button click just replot everything, so Output widget is the key. But I still can't get, what the reason not to make interactive plots look like inline ones? Why we need terrible caption and useless toolbar? – Anton Ovsyannikov Dec 19 '17 at 13:23
  • The caption is a design choice. Not everyone needs to like it. The toolbar is for sure not useless, it is the key to interact with the plot. At the end you may of course ask how to make the matplotlib notebook output look like you want it to. That would be a different question, which you may research on and potentially ask a new question about. – ImportanceOfBeingErnest Dec 19 '17 at 13:28
  • See e.g. [this question](https://stackoverflow.com/questions/41928387/jupyter-interactive-matplotlib-hide-the-toolbar-of-the-interactive-view). – ImportanceOfBeingErnest Dec 19 '17 at 13:44