# Jupyter Notebook: interactive plot with widgets

## Question:

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.)

## Answers:

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

- Use an interactive backend;
`%matplotlib notebook`

- 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);
```

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`

.

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));
```