Python bqplot和ipywidget滑块,最大递归深度

Python bqplot和ipywidget滑块,最大递归深度,python,widget,jupyter,bqplot,Python,Widget,Jupyter,Bqplot,如果我执行以下笔记本,一切似乎都正常。但是,当我移动滑块时,笔记本的响应几乎降为零,过了一段时间,我出现以下错误: RecursionError: maximum recursion depth exceeded in comparison 你能告诉我为什么吗 # We'll start with bqplot's matplotlib inspired API from bqplot import pyplot as plt # Let's begin by importing some

如果我执行以下笔记本,一切似乎都正常。但是,当我移动滑块时,笔记本的响应几乎降为零,过了一段时间,我出现以下错误:

RecursionError: maximum recursion depth exceeded in comparison
你能告诉我为什么吗

# We'll start with bqplot's matplotlib inspired API

from bqplot import pyplot as plt

# Let's begin by importing some libraries we'll need
import numpy as np

import ipywidgets as wi

def make_data(x, sigma_noise):
    """
    Generates a sine wave

    :param x: x value, scalar or vector between 0 and ..
    :param sigma_noise: standard deviation of the noise added to the data
    """
    y = np.sin(x)
    noise = np.random.normal(loc=0, scale=sigma_noise, size=len(x))
    y_noise = y + noise   
    return y_noise


def update_plot(message):
    y_noise = make_data(x, slider.value)
    plot_1.y = y_noise

x = np.linspace(0, 10)
y = make_data(x, noise)

figure = plt.figure(title='Test', animation_duration=100)
#figure.animation_duration = 250
plot_1 = plt.scatter(x, y)
plot_1.observe(update_plot, ['x','y'])

slider = wi.FloatSlider(description='noise', value=0.001, min=0, max=1)
slider.observe(update_plot, 'value')

wi.VBox([slider, figure])

编辑:DougR提供的解决方案有效。此外,我还找到了另一个解决方案:
figure.observe(更新绘图,['x','y'])
而不是
plot\u1.observe(更新绘图,['x','y'])
您在plot1图上有一个observe调用,随后更新plot1图。。。这将导致递归循环。如果在函数中放入If语句,则可以将其设置为仅在第一次操作后运行

# We'll start with bqplot's matplotlib inspired API

from bqplot import pyplot as plt

# Let's begin by importing some libraries we'll need
import numpy as np

import ipywidgets as wi

def make_data(x, sigma_noise):
    """
    Generates a sine wave

    :param x: x value, scalar or vector between 0 and ..
    :param sigma_noise: standard deviation of the noise added to the data
    """
    y = np.sin(x)
    noise = np.random.normal(loc=0, scale=sigma_noise, size=len(x))
    y_noise = y + noise   
    return y_noise


def update_plot(message):
#     print(message)
    if message['name'] == 'value':
        y_noise = make_data(x, slider.value)
        plot_1.y = y_noise

noise = 2
x = np.linspace(0, 10)
y = make_data(x, noise)

figure = plt.figure(title='Test', animation_duration=100)
#figure.animation_duration = 250
plot_1 = plt.scatter(x, y)
plot_1.observe(update_plot, ['x','y'])

slider = wi.FloatSlider(description='noise', value=0.001, min=0, max=1)
slider.observe(update_plot, 'value')

wi.VBox([slider, figure])

有趣。与此同时,我找到了另一个解决方案:figure.observe而不是plot_1.observe。我不知道它为什么会起作用,但不知何故,它似乎是有道理的,因为正在自我更新的情节导致了这个错误。