我有两个滑块设置,一个用于控制绘图上的位置,一个用于控制 x 轴的比例。这很好用,除了我使用与 x 轴实际不同的数据框来控制滑块,因为它在 Excel 日期时间中,并且我无法让它与滑块一起使用。我通过创建另一个 df、滑块来实现此目的,其长度与 x-asix、时间使用的 df 相同。我遇到的问题是,当两个滑块值的总和高于 100 时,索引值将超出时间 df 。我尝试使用here找到的解决方案,但只能以这种方式控制一个滑块,并且缩放滑块的总和仍将超过 100。任何有关限制顶部滑块的建议将不胜感激
干杯
class slider_limit(object):
def __init__(self, slider, func):
self.func, self.slider = func, slider
@property
def val(self):
return self.func(self.slider.val)
ax_scale = plt.axes([0.2, 0.1, 0.65, 0.03])
slider_scale = Slider(ax_scale, 'Scale', 0.0, 100, valstep=100/(len(data.slider)-1), valinit=1, slidermax=slider_limit(slider_pos, lambda x: 100 - x))
ax_pos = plt.axes([0.2, 0.05, 0.65, 0.03])
slider_pos = Slider(ax_pos, 'Position', 0.0, 100, valstep=100/(len(data.slider)-1), valinit=0, slidermax=slider_limit(slider_scale, lambda x: 100 - x))
def update(val):
scale_index = data[data['slider'] == slider_scale.val].index[0]
pos_index = data[data['slider'] == slider_pos.val].index[0]
scale = data.time[pos_index + scale_index]
pos = data.time[pos_index]
slider_sum = slider_scale.val + slider_pos.val
ax.set_xlim(pos, scale)
fig.canvas.draw_idle()
slider_scale.on_changed(update)
slider_pos.on_changed(update)
我可以通过将
slidermax
设置在滑块最初设置的位置之外来做到这一点
class slider_limit(object):
def __init__(self, slider, func):
self.func, self.slider = func, slider
@property
def val(self):
return self.func(self.slider.val)
slider_scale = Slider(ax_scale, 'scale', 0.0, 100, valinit=1)
slider_pos = Slider(ax_pos, 'position', 0.0, 100, valinit=0)
slider_scale.slidermax = slider_limit(slider_pos, lambda x: 100 - x)
slider_pos.slidermax = slider_limit(slider_scale, lambda x: 100 - x)
def update(val):
scale_index = data[data['slider'] == slider_scale.val].index[0]
pos_index = data[data['slider'] == slider_pos.val].index[0]
scale = data.time[pos_index + scale_index]
pos = data.time[pos_index]
ax1.set_xlim(pos, scale)
fig.canvas.draw_idle()
slider_scale.on_changed(update)
slider_pos.on_changed(update)