我想通过选择权重来选择三角形的一个点。这应该通过控制 2 个 slider (matplotlib.widgets.Slider) 来完成。这两个 slider 表示定义点的三个权重中的两个。第三个权重很容易计算为 1.0 - slider1 - slider2。
现在很明显所有权重的总和应该等于 1.0,因此选择 0.8 和 0.9 作为两个 slider 的值应该是不可能的。参数 slidermax 允许使 slider 依赖,但我不能说:
slider2 = Slider(... , slidermax = 1.0-slider1)
slidermax 需要类型 Slider,而不是 integer。 我怎样才能创建比这个 slidermax 选项稍微复杂一点的依赖关系?
请您参考如下方法:
@ubuntu 的回答很简单。
另一种选择是子类化 Slider 以完全按照您的意愿行事。这将是最灵活的(您甚至可以使 slider 相互更新,而它们目前不这样做)。
但是,在这种情况下很容易使用“ducktyping”。唯一的要求是 slidermin 和 slidermax 有一个 val 属性。它们实际上不必是 Slider 的实例。
考虑到这一点,您可以执行以下操作:
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
class FakeSlider(object):
def __init__(self, slider, func):
self.func, self.slider = func, slider
@property
def val(self):
return self.func(self.slider.val)
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.25)
sliderax1 = fig.add_axes([0.15, 0.1, 0.75, 0.03], axisbg='gray')
sliderax2 = fig.add_axes([0.15, 0.15, 0.75, 0.03], axisbg='gray')
slider1 = Slider(sliderax1, 'Value 1', 0.1, 5, valinit=2)
slider2 = Slider(sliderax2, 'Value 2', -4, 0.9, valinit=-3,
slidermax=FakeSlider(slider1, lambda x: 1 - x))
plt.show()
