2015-05-13 12 views
5

Każdy przykład widziałem korzystania widżety dla interaktywnych wykresów matplotlib w notebooku zrobić coś takiego (dostosowany od here):Czy można przyspieszyć interaktywne wątki IPython Notebook, nie generując nowych danych za każdym razem?

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

Podejrzewam, że reaktywność działki może zostać przyspieszony, jeśli was ogromnie nie trzeba było tworzyć zupełnie nowej figury z plt.subplots() lub plt.figure() za każdym razem, gdy widget został dostosowany.

Próbowałem kilku rzeczy, aby przenieść tworzenie figur poza funkcją wywoływaną przez interact(), ale nic nie zadziałało.

+0

użycie '% matplotlib notebook' a następnie można zmutować swoje osie/obiekty artysty i ponowne losowanie. – tacaswell

Odpowiedz

6

Niektóre setup:

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

Tworzenie obiektów:

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) 

i interaktywne (co moim zdaniem musi iść w jego własnych komórek)

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

Można również szturchaj obiekty z innej komórki:

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

lub

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

Umieszczenie interaktywnego połączenia we własnej komórce jest tym, co naprawiło to dla mnie, nie wiem, dlaczego było to konieczne. –

Powiązane problemy