Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jupyter Notebook: interactive plot with widgets

I am trying to generate an interactive plot that depends on widgets. The problem I have is that when I change parameters using the slider, a new plot is done after the previous one, instead I would expect only one plot changing according to the parameters.

Example:

from ipywidgets import interact, interactive, fixed, interact_manual import ipywidgets as widgets  import matplotlib.pyplot as plt %matplotlib inline  import numpy as np  def plot_func(freq):     x = np.linspace(0, 2*np.pi)     y = np.sin(x * freq)     plt.plot(x, y)  interact(plot_func, freq = widgets.FloatSlider(value=7.5,                                                min=1,                                                max=5.0,                                                step=0.5)) 

After moving the slider to 4.0, I have:

enter image description here

while I just want one figure to change as I move the slider. How can I achieve this?

(I am using Python 2.7, matplotlib 2.0 and I have just updated notebook and jupyter to the latest version. let me know if further info is needed.)

like image 284
FLab Avatar asked Jun 02 '17 12:06

FLab


2 Answers

As you want to change the figure, instead of creating a new one, may I suggest the following way:

  1. Use an interactive backend; %matplotlib notebook
  2. Update the line in the plot, instead of drawing new ones.

So the code could look something like this:

%matplotlib notebook from ipywidgets import * import numpy as np import matplotlib.pyplot as plt  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_idle()  interact(update); 

enter image description here

Alternatively you may use plt.show() as in this answer.

like image 152
ImportanceOfBeingErnest Avatar answered Sep 22 '22 22:09

ImportanceOfBeingErnest


This is an issue (?) introduced in the last version of jupyter and/or ipywidgets. One workaround I found was to add the line plt.show() at the end of plot_func.

like image 25
Stelios Avatar answered Sep 20 '22 22:09

Stelios