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:
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:
%matplotlib notebook
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 plot_func
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With