2014-03-19 50 views
0

我繪製的數據超過4個維度。爲了使可視化更容易,我還想繪製不同維度的所有可能的2D和3D組合。Matplotlib Radiobutton在clf()後不再工作()

要做到這一點,我想要一個數字,並使用RadioButtons瀏覽不同的選項。現在,當我從2D轉換到3D時,我需要不同數量的軸,因此我清除了整個圖形並再次繪製了所有圖形,但是我的RadioButton不再工作(儘管我在clf()之後再次繪製它):

class TEST(object): 


def __init__(self):  
    self.num2d = 6 
    self.rows2d = 3 
    self.cols2d = 2 

    self.num3d = 4 
    self.rows3d = 2 
    self.cols3d = 2 

    self.fig2 = plt.figure() 
    self.add2dAxes = [] 

    for i in range(self.num2d): 
     ii = 100*self.rows2d + 10*self.cols2d + i+1 
     self.add2dAxes.append(plt.subplot(ii)) 
    self.add_dim = 2 

    self.updatePlotAdd() 

    def click_dim(dim): 
     print dim 
     if dim == "2D": 
      self.updatePlotAdd2d() 
     elif dim == "3D": 
      self.updatePlotAdd3d() 
     else: 
      self.updatePlotAdd4d() 
    self.radioDim.on_clicked(click_dim) 
    self.fig2._my_btn = self.radioDim 
    plt.show() 

def updatePlotAdd2d(self): 
    print "2D" 
    self.add_dim = 2 
    self.fig2.clf() 
    self.add2dAxes = [] 
    for i in range(self.num2d): 
     ii = 100*self.rows2d + 10*self.cols2d + i+1 
     self.add2dAxes.append(plt.subplot(ii)) 
    self.updatePlotAdd() 
def updatePlotAdd3d(self): 
    print "3D" 
    self.add_dim = 3 
    self.fig2.clf() 
    self.add3dAxes = [] 
    for i in range(self.num3d): 
     ii = 100*self.rows3d + 10*self.cols3d + i+1 
     self.add3dAxes.append(plt.subplot(ii)) 
    self.updatePlotAdd() 

def updatePlotAdd4d(self): 
    print "4D" 
    self.add_dim = 4 
    self.fig2.clf() 
    self.updatePlotAdd() 

def updatePlotAdd(self):   
    print "updatePlotAdd" 
    rax = plt.axes([0.01, 0.7, 0.08, 0.1], axisbg='grey') 
    self.radioDim = RadioButtons(rax, ("2D", "3D","> 3D"), active=self.add_dim-2) 
    self.fig2.canvas.draw() 

此示例顯示了第一次單擊按鈕時軸的變化是如何完美的,但從此按鈕不再響應。

+1

你可以減少到最低_minimal_版本,將複製問題?這裏有太多的代碼與您的問題無關。人們願意提供幫助,但可能不願意徹底排除那些混亂。 – tacaswell

回答

0

我想問題是,在您的「updatePlotAdd」中,您正在重新創建RadioButtons對象,但您沒有將事件觸發器分配給此新對象。

如何使私有函數「click_dim」作爲類成員函數,並調用updatePlotAdd?

def click_dim(self, dim): 
    print dim 
    if dim == "2D": 
     self.updatePlotAdd2d() 
    elif dim == "3D": 
     self.updatePlotAdd3d() 
    else: 
     self.updatePlotAdd4d() 

並添加一行到updatePlotAdd:

def updatePlotAdd(self):   
    print "updatePlotAdd" 
    rax = plt.axes([0.01, 0.7, 0.08, 0.1], axisbg='grey') 
    self.radioDim = RadioButtons(rax, ("2D", "3D","> 3D"), active=self.add_dim-2) 
    self.radioDim.on_clicked(self.click_dim) 
    self.fig2.canvas.draw() 

當然也是一樣給init太

self.radioDim.on_clicked(self.click_dim) 

有了這些修改,似乎正如你在我的控制檯預期工作。