是否有可能通过不每次生成新数据来加速交互式IPython Notebook图?

Wil*_*ler 5 python interactive matplotlib ipython-notebook jupyter

我在笔记本中看到使用小部件进行交互式matplotlib绘图的每个例子都是这样的(从这里改编):

%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)
Run Code Online (Sandbox Code Playgroud)

我怀疑,如果您不必创建一个全新的数字plt.subplots()plt.figure()每次调整一个小部件时,情节的响应能力可以大大加快.

我已经尝试了一些东西来将图形创建移到被调用的函数之外interact()但没有任何工作.

tac*_*ell 6

一些设置:

%matplotlib notebook
import matplotlib.pyplot as plt
from IPython.html.widgets import interactive
from IPython.display import display
import numpy as np
Run Code Online (Sandbox Code Playgroud)

创建对象:

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)
Run Code Online (Sandbox Code Playgroud)

和互动(我认为需要进入它自己的单元格)

interactive(beat_freq, f1=(200.0,300.0), f2=(200.0,300.0))
Run Code Online (Sandbox Code Playgroud)

您还可以从不同的单元格中查看对象:

ax.set_xlim(0, .05)
ax.set_ylim(-2, 2)
plt.draw()
Run Code Online (Sandbox Code Playgroud)

要么

lnB.set_color('g')
ax.legend()
plt.draw()
Run Code Online (Sandbox Code Playgroud)