<p>问题的一部分是很难修改Matplotlib图形中的单个元素,也就是说,从头开始重新绘制整个绘图要容易得多。重新绘制整个图形不会是超快速或平滑的。因此,我将向您展示一个如何在BQplot中执行此操作的示例(如Pascal Bugnion所建议的)。它不是Matplotlib,我猜你可能想要的,但它确实演示了一种方法,可以将斜率和随机性指令以及计算从每个滑块中分离出来,同时仍然使用标准的交互式小部件。在</p>
<p><a href="https://i.stack.imgur.com/wy3j8.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/wy3j8.gif" alt="enter image description here"/></a></p>
<pre><code>import bqplot as bq
import numpy as np
import ipywidgets as widgets
def calcSlope(num_points, slope):
a = np.linspace(0, 9, num_points)
b = a * slope
line1.x = a
line1.y = b
def calcXY(num_points, randNum):
x = np.linspace(3, 9, num_points)
y = x
#add randomness to scatter
x = np.random.uniform(low=1-randNum/100, high=1+ randNum/100, size=(len(x))) * x
y = np.random.uniform(low=1-randNum/100, high=1+ randNum/100, size=(len(y))) * y
#format & plot the figure
x_sc.min = x.min()
x_sc.max = x.max() + 1
scat.x = x
scat.y = y
def rand_int(rand):
calcXY(num_i.children[0].value, rand)
def num_points_int(num_points):
calcXY(num_points, rand_i.children[0].value)
calcSlope(num_points, slope_i.children[0].value)
def slope_int(slope):
calcSlope(num_i.children[0].value, slope)
rand_i = widgets.interactive(rand_int,
rand = widgets.FloatSlider(
value=3,
min=0,
max=50,
step=3,
description='Randomness:', num_points=(10, 50, 5)
)
)
num_i = widgets.interactive(num_points_int,
num_points = widgets.IntSlider(
value=20,
min=10,
max=50,
step=5,
description='Number of points:'
)
)
slope_i = widgets.interactive(slope_int,
slope=widgets.FloatSlider(
value=1,
min=-1,
max=5,
step=0.1,
description='Slope'
)
)
# Create the initial bqplot figure
x_sc = bq.LinearScale()
ax_x = bq.Axis(label='X', scale=x_sc, grid_lines='solid', tick_format='0f')
ax_y = bq.Axis(label='Y', scale=x_sc, orientation='vertical', tick_format='0.2f')
line1 = bq.Lines( scales={'x': x_sc, 'y': x_sc} , colors=['blue'],display_legend = False, labels=['y1'],stroke_width = 1.0)
scat = bq.Scatter(scales={'x': x_sc, 'y': x_sc} , colors=['red'],display_legend = False, labels=['y1'],stroke_width = 1.0)
calcSlope(num_i.children[0].value, slope_i.children[0].value)
calcXY(num_i.children[0].value, rand_i.children[0].value)
m_fig = dict(left=100, top=50, bottom=50, right=100)
fig = bq.Figure(axes=[ax_x, ax_y], marks=[line1,scat], fig_margin=m_fig, animation_duration = 1000)
widgets.VBox([rand_i,num_i,slope_i,fig])
</code></pre>