2015-05-13 34 views
5

Ogni esempio che ho visto di utilizzare i widget per i grafici matplotlib interattivi nel notebook fare qualcosa di simile (adattato da here):È possibile velocizzare i grafici interattivi di Notebook IPython non generando nuove cifre ogni volta?

%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(-(x-a)/(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) 

Ho il sospetto che la risposta della trama potrebbe essere accelerato enormemente se si non è stato necessario creare una nuova figura con plt.subplots() o plt.figure() ogni volta che veniva modificato un widget.

Ho provato alcune cose per spostare la creazione di figure al di fuori della funzione chiamata da interact() ma non ha funzionato.

+0

uso '% matplotlib notebook' e quindi è possibile mutare i vostri assi/oggetti di artisti e la ri-draw. – tacaswell

risposta

6

Alcuni di impostazione:

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

Crea i tuoi oggetti:

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) 

e interattivo (che credo ha bisogno di andare in un suo cellulare)

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

È inoltre possibile colpire gli oggetti da una cella diversa:

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

o

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

Inserire la chiamata interattiva nella sua cella è ciò che ha risolto per me, non so perché questo fosse necessario. –