如果我执行以下笔记本,一切似乎都可以正常工作。但是,当我移动滑块时,笔记本电脑的响应度几乎降为零,一段时间后出现以下错误:
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(update_plot, ['x','y'])
而不是plot_1.observe(update_plot, ['x','y'])
答案 0 :(得分:1)
您对plot1图形进行了观察调用,随后调用了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])