20

I want to implement an interactive plot using Matplotlib and ipywidgets in IPython (python3). So, how I can do this efficiently (change smoothly without delay)?

And another question is why this code works?!

from ipywidgets import *
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.linspace(0, 2 * np.pi)

def update(w = 1.0):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, np.sin(w * x))

    fig.canvas.draw()

interact(update);

enter image description here

But, this doesn't work?!

from ipywidgets import *
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.linspace(0, 2 * np.pi)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
line, = ax.plot(x, np.sin(x))

def update(w = 1.0):
    line.set_ydata(np.sin(w * x))
    fig.canvas.draw()

interact(update);

enter image description here

1
  • 1
    Did you ever find a way to get the second example to work? I have the same problem right now. Commented Apr 20, 2017 at 23:06

1 Answer 1

8

The second approach is the right one for the notebook backend

%matplotlib notebook

Or with ipympl.

However, it won't work with the inline backend which does not update the plot.

Sign up to request clarification or add additional context in comments.

3 Comments

For me, the second approach does not work for the notebook backend. No graph is shown at all.
I recommend using ipympl (aka jupyter-matplotlib), which is the notebook backend split into a separate package. The reason for the split is that release cycles of Jupyter are much faster than matplotlib. ipympl is separated from matplotlib to be able to track this better.
Also, fig.show() is necessary in order to show the canvas.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.