matplotlib 多个依赖滑块

问题描述 投票:0回答:1

我有两个滑块设置,一个用于控制绘图上的位置,一个用于控制 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)
python matplotlib slider matplotlib-widget
1个回答
0
投票

我可以通过将

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)
© www.soinside.com 2019 - 2024. All rights reserved.