2013-07-23 19 views
3

我有兩個CheckButtons小部件,每個小部件都有3個元素。我希望在選中任何一個CheckButton時,閱讀這兩個小部件的狀態,然後相應地更新圖表。從matplotlib中的CheckButtons對象中檢索選定的值

滑塊小部件有一個.val用於返回滑塊的狀態,但CheckButtons小部件似乎有點尷尬(或者我錯過了明顯的東西)?

短的例子:

import matplotlib.pyplot as plt 
from matplotlib.widgets import CheckButtons 

class Example: 

    def updateChart(self, event): 
     colour = self.colours.labels # gets labes as text object, is there an easy way of getting the status? 
     print colour 
     # measurement = measurements.something 

    def __init__(self): 
     colourax = plt.axes([0.5, 0.4, 0.09, 0.2]) 
     measurementax = plt.axes([0.5, 0.6, 0.09, 0.2]) 
     self.colours = CheckButtons(colourax, ('Red', 'Green', 'Blue'), (False, False, False)) 
     self.measurements = CheckButtons(measurementax, ('1', '2', '3'), (False, False, False)) 
     self.colours.on_clicked(self.updateChart) 
     self.measurements.on_clicked(self.updateChart) 

    def run(self): 
     plt.show() 

ex = Example() 
ex.run() 

回答

1

有或許會對一個更優雅的方式,但你可以始終保持每個複選框自己,例如中的狀態的軌道在dict。您指定使用on_clicked()的功能將得到積極的複選框的標籤字符串作爲其第二個參數,然後你就可以使用適當地更新狀態:

import matplotlib.pyplot as plt 
from matplotlib.widgets import CheckButtons 

class Example: 

    def onColor(self,label): 
     self.cstates[label] = not self.cstates[label] 
     print 'un'*(not self.cstates[label]) + 'checked %s' %label 
     self.updateChart() 

    def onMeasurement(self,label): 
     self.mstates[label] = not self.mstates[label] 
     print 'un'*(not self.mstates[label]) + 'checked %s' %label 
     self.updateChart() 

    def updateChart(self, event=None): 
     """do something here using self.cstates and self.mstates?""" 
     pass 

    def __init__(self): 
     colourax = plt.axes([0.5, 0.4, 0.09, 0.2]) 
     measurementax = plt.axes([0.5, 0.6, 0.09, 0.2]) 
     clabels, cvals = ('Red', 'Green', 'Blue'), (False,)*3 
     mlabels, mvals = ('1', '2', '3'), (False,)*3 
     self.cstates = dict(zip(clabels,cvals)) 
     self.mstates = dict(zip(mlabels,mvals)) 
     self.colours = CheckButtons(colourax, clabels, cvals) 
     self.colours.on_clicked(self.onColor) 
     self.measurements = CheckButtons(measurementax, mlabels, mvals) 
     self.measurements.on_clicked(self.onMeasurement) 

    def run(self): 
     plt.show() 

ex = Example() 
ex.run() 

不是最漂亮的,但它的工程!

+0

這正是我所做的,跟蹤自己的交互。哦,謝謝! – illumi

5

我知道這有點尷尬,但您可以檢查複選框中交叉線的可見性。

import matplotlib.pyplot as plt 
from matplotlib.widgets import CheckButtons 

colourax = plt.axes([0.5, 0.4, 0.09, 0.2]) 
colours = CheckButtons(colourax, ('Red', 'Green', 'Blue'), (False, False, False)) 

isRedChecked = colours.lines[0][0].get_visible() 
isGreenChecked = colours.lines[1][0].get_visible() 
isBlueChecked = colours.lines[2][0].get_visible() 
0

目前開發的版本(如2017年7月)具有一個併入

CheckButtons.get_status() 

方法。這可以用來查詢複選框的當前狀態。它應該很快在穩定版本中發佈。 (Source here

在此之前,您可以使用自己的get_status方法來模擬此行爲,如下所示。它使用了與開發版本中的get_status()方法相同的機制,這也與@Gruby提出的答案非常接近(查看行的可見性)。

import matplotlib.pyplot as plt 
from matplotlib.widgets import CheckButtons 

class Example: 

    def updateChart(self, event): 
     colour = self.get_status(self.colours) 
     measurement = self.get_status(self.measurements) 
     print measurement, colour 

    def get_status(self, cb): 
     return [l1.get_visible() for (l1, l2) in cb.lines] 


    def __init__(self): 
     colourax = plt.axes([0.5, 0.4, 0.09, 0.2]) 
     measurementax = plt.axes([0.5, 0.6, 0.09, 0.2]) 
     self.colours = CheckButtons(colourax, ('Red', 'Green', 'Blue'), (False, False, False)) 
     self.measurements = CheckButtons(measurementax, ('1', '2', '3'), (False, False, False)) 
     self.colours.on_clicked(self.updateChart) 
     self.measurements.on_clicked(self.updateChart) 

    def run(self): 
     plt.show() 

ex = Example() 
ex.run()