17

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

denfromufa
  • 4,995
  • 11
  • 66
  • 130
Yas
  • 3,443
  • 1
  • 29
  • 22

1 Answers1

7

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.

Quant
  • 1,393
  • 13
  • 21
  • 2
    For me, the second approach does not work for the notebook backend. No graph is shown at all. – tfv May 25 '17 at 12:38
  • 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. – Quant Dec 31 '17 at 09:36
  • 2
    Also, `fig.show()` is necessary in order to show the canvas. – jmborr Jun 11 '18 at 19:45