Matplotlib 如何在更改小部件的某些属性后强制重新绘制小部件?

Matplotlib 如何在更改小部件的某些属性后强制重新绘制小部件?,matplotlib,matplotlib-widget,Matplotlib,Matplotlib Widget,在与matplotlib.widgets.Slider实例关联的回调中,我想修改Slidervalmin、valmax和val属性,然后重新绘制滑块。当我试图重新画它时,什么也没发生 在回拨完成之前,我调用plt.draw(),在正确更新其余绘图的同时,滑块看起来与以前一样。我还尝试在滑块的轴上调用draw(),再次没有可见的更改 更改滑块实例的属性后,如何强制重新绘制该实例 坦斯克 更新 这里是一个演示该问题的小程序(带有一个粗略的对话框)。想要的行为是,通过单击单选按钮的不同值,滑块可以更改

在与
matplotlib.widgets.Slider
实例关联的回调中,我想修改Slider
valmin
valmax
val
属性,然后重新绘制
滑块。当我试图重新画它时,什么也没发生

在回拨完成之前,我调用
plt.draw()
,在正确更新其余绘图的同时,
滑块看起来与以前一样。我还尝试在
滑块的
轴上调用
draw()
,再次没有可见的更改

更改
滑块
实例的属性后,如何强制重新绘制该实例

坦斯克

更新

这里是一个演示该问题的小程序(带有一个粗略的对话框)。想要的行为是,通过单击单选按钮的不同值,滑块可以更改值的范围、当前值和标签。相反,当单击“渐变”时,滑块停止响应(不能再拖动),当单击“渐变”或“通道”时,滑块不会更新,尽管调用了
plt.draw()


slider本身是一个承载和管理某些参数的类。它没有绘制方法

也就是说,仅仅设置滑块的参数是不够的,还需要更新滑块所在的轴。最后,所有这些都归结为滑块正在执行初始化的步骤,因此您可以简单地调用silder的
\uuuu init\uuu
函数

我强烈建议使用两种不同的功能,一种用于更改按钮单击时调用的滑块,另一种用于调整滑块值时应发生的事情

以下是一个工作示例:

from matplotlib import pyplot as plt
from matplotlib import gridspec
from matplotlib.widgets import Slider, RadioButtons

# Set the grid
grid = gridspec.GridSpec(2, 1, height_ratios=[1, 2])

# Plot the sliders
axes_slider = plt.subplot(grid[0, 0])
slider = Slider(axes_slider, 'Channel', valmin=0, valmax=255, valinit=128)

# Plot the radio buttons
axes_button = plt.subplot(grid[1, 0])
button = RadioButtons(axes_button, ('Gradient', 'Channel'), active=1)

plt.tight_layout(h_pad=0)
plt.subplots_adjust(left=.2, right=.9)

def buttonupdate(val):
    if val == "Gradient":
        axes_slider.clear()
        slider.__init__(axes_slider, 'Gradient', valmin=-1, valmax=1, valinit=0)        
    else:
        axes_slider.clear()
        slider.__init__(axes_slider, 'Channel', valmin=0, valmax=255, valinit=128) 
    plt.gcf().canvas.draw_idle()

def sliderupdate(val):
    if slider.label.get_text() == 'Gradient':
        #do something depending on gradient value
        pass
    else:
        #do something depending on channel value
        pass

# Register call-backs with widgets
slider.on_changed(sliderupdate)
button.on_clicked(buttonupdate)

plt.show()

我将尝试提出一个仍然重现问题的简短程序。我已经用一个代码示例更新了这个问题。
from matplotlib import pyplot as plt
from matplotlib import gridspec
from matplotlib.widgets import Slider, RadioButtons

# Set the grid
grid = gridspec.GridSpec(2, 1, height_ratios=[1, 2])

# Plot the sliders
axes_slider = plt.subplot(grid[0, 0])
slider = Slider(axes_slider, 'Channel', valmin=0, valmax=255, valinit=128)

# Plot the radio buttons
axes_button = plt.subplot(grid[1, 0])
button = RadioButtons(axes_button, ('Gradient', 'Channel'), active=1)

plt.tight_layout(h_pad=0)
plt.subplots_adjust(left=.2, right=.9)

def buttonupdate(val):
    if val == "Gradient":
        axes_slider.clear()
        slider.__init__(axes_slider, 'Gradient', valmin=-1, valmax=1, valinit=0)        
    else:
        axes_slider.clear()
        slider.__init__(axes_slider, 'Channel', valmin=0, valmax=255, valinit=128) 
    plt.gcf().canvas.draw_idle()

def sliderupdate(val):
    if slider.label.get_text() == 'Gradient':
        #do something depending on gradient value
        pass
    else:
        #do something depending on channel value
        pass

# Register call-backs with widgets
slider.on_changed(sliderupdate)
button.on_clicked(buttonupdate)

plt.show()