获取 Matplotlib 单选按钮的状态

Get status of Matplotlib radio button

使用Matplotlib,我可以通过"mySlider.val"获取一个Slider widget的值,非常方便。是否有等效的功能来获取单选按钮的当前选择?我认为这个问题是 this question 想问的问题,但提问者没有提供有效的例子。我提供了以下示例,指出了我正在寻找的缺失的代码行。

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

axSlider = plt.axes([0.1, 0.8, 0.4, 0.05])
aSlider  = Slider(axSlider,'A slider', 0,1,  valinit=0.5)

axRadio  = plt.axes([0.1, 0.2, 0.3, 0.4])
butRadio = RadioButtons(axRadio, ('Top','Middle','Bottom'))

axStatus = plt.axes([0.5, 0.2, 0.3, 0.4])
bStatus  = Button(axStatus,'Get status of radio buttons')

def get_status(val):
    #radioValue = ???? -- Need this line of code.
    radioValue = 0
    sliderValue= aSlider.val
    print 'Slider value: %.2f, Radio button value: %.2f'%(sliderValue,radioValue)

bStatus.on_clicked(get_status)
plt.show()

输出结果如下:

如果这不可能,你能推荐一个优雅的work-around吗?目前我正在为单选按钮使用 "on_clicked" 函数并使用单选按钮的值设置全局变量,这很混乱。

根据@tcaswell 的建议,我在 github 上向 matplotlib 提交了 pull request,现在可以查询 RadioButtons 的当前状态。缺少的代码行是:

radioValue = butRadio.value_selected

计划将其合并到 matplotlib 的 1.5.x 版本中。同时,如果你想使用这个功能,你需要下载 matplotlib from github 的开发版本(或者,至少下载 'widgets.py' 文件)。

这现已合并到当前版本的 Matplotlib (1.5.3) 中。 (参见 Widets Docs。)如果以上行不起作用,您可能只需更新 Matplotlib。

刚刚在对同一问题进行研究时偶然发现了这个 post。他们还没有对 matplotlib 进行任何更新,尽管我确实在此处找到了有关从 matplotlib 的复选按钮中检索值的相关 post:Retrieving the selected values from a CheckButtons object in matplotlib

总而言之,答案就是保留一个 dict,您可以在其中为每个按钮存储一个变量。每当按下按钮时,让事件处理程序更改 dict 中的必要值,然后其他函数可以根据需要访问这些值,而不是仅将这些值困在事件处理程序中。

希望对您有所帮助!我知道我不想玩弄 matplotlib 的源代码

最简单的答案是:

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

axSlider = plt.axes([0.1, 0.8, 0.4, 0.05])
aSlider  = Slider(axSlider,'A slider', 0,1,  valinit=0.5)

axRadio  = plt.axes([0.1, 0.2, 0.3, 0.4])
my_list = ('Top','Middle','Bottom')
butRadio = RadioButtons(axRadio, my_list)

axStatus = plt.axes([0.5, 0.2, 0.3, 0.4])
bStatus  = Button(axStatus,'Get status of radio buttons')

def activated_radio_button(x,list):     
    for i in xrange(len(x.circles)):
                if x.circles[i].get_facecolor()[0]<.5:
                    return list[i]

def get_status(label):
    radioValue = activated_radio_button(butRadio,my_list)
    sliderValue= aSlider.val
    print 'Slider value: %.2f, Radio button value: %s'%(sliderValue,radioValue)

bStatus.on_clicked(get_status)
plt.show()