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.
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:
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.)
As you want to change the figure, instead of creating a new one, may I suggest the following way:
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);
Alternatively you may use
plt.show() as in this answer.
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
For completion, here is an answer that makes use of more than one slider bar and sets the default parameters as well as the interval lengths.
%matplotlib notebook from ipywidgets import * import numpy as np import matplotlib.pyplot as plt x = np.linspace(-10, 10,100) def f(x, A, B, C): return A*x**2 + B*x + C fig = plt.figure() ax = fig.add_subplot(1, 1, 1) line, = ax.plot(x, f(x, A=1, B=1, C=1)) def update(A = 1, B = 0, C = 0): line.set_ydata(f(x,A,B,C)) fig.canvas.draw_idle() interact(update, A = (-4,4,0.1), B = (-4,4,0.1), C = (-4,4,0.1));