Is it possible to speed up the interactive graphics of IPython Notebook without generating new numbers every time?

In each example I've seen using matplotlib interactive graph widgets in a notebook, do something like this (adapted from here ):

%matplotlib inline import numpy as np import matplotlib.pyplot as plt from IPython.html.widgets import interact from IPython.display import display def sigmoid_demo(a=5,b=1): x = np.linspace(0,10,256) s = 1/(1+np.exp(-(xa)/(b+0.1))) # +0.1 to avoid dividing by 0 sn = 100.0*(s-min(s))/(max(s)-min(s)) # normalize sigmoid to 0-100 # Does this have to be in this function? fig, ax = plt.subplots(figsize=(24,6)) ax.set_xticks([]) ax.set_yticks([]) plt.plot(x,sn,lw=2,color='black') plt.xlim(x.min(), x.max()) w=interact(sigmoid_demo,a=5,b=1) 

I suspect that the responsiveness of the plot can be greatly accelerated if you did not need to create a new shape with plt.subplots() or plt.figure() every time the widget has been adjusted.

I tried a few things to move the shape outside of the function called interact() , but nothing worked.

+5
source share
1 answer

Some setting:

 %matplotlib notebook import matplotlib.pyplot as plt from IPython.html.widgets import interactive from IPython.display import display import numpy as np 

Create your objects:

 fig, ax = plt.subplots() ax.set_xlim(0, .25) ax.set_ylim(-2.5, 2.5) ax.set_title('beat frequencies') lnA, = ax.plot([], [], color='r', label='A') lnB, = ax.plot([], [], color='purple', label='B') lnsum, = ax.plot([], [], color='k', label='signal') ax.legend() max_time = 3 rate = 8000 times = np.linspace(0,max_time,rate*max_time) def beat_freq(f1=220.0, f2=224.0): A = np.sin(2*np.pi*f1*times) B = np.sin(2*np.pi*f2*times) sig = A + B lnA.set_data(times, A) lnB.set_data(times, B) lnsum.set_data(times, sig) plt.draw() beat_freq(0, 0) 

and interactive (which, I think, should go into its own cell)

 interactive(beat_freq, f1=(200.0,300.0), f2=(200.0,300.0)) 

You can also protrude objects from another cell:

 ax.set_xlim(0, .05) ax.set_ylim(-2, 2) plt.draw() 

or

 lnB.set_color('g') ax.legend() plt.draw() 
+6
source

All Articles