Matplotlib 单选按钮在 clf() 后不再工作

0 投票
1 回答
507 浏览
提问于 2025-04-17 22:58

我正在绘制一个有超过4个维度的数据。为了让可视化更简单,我还想绘制不同维度的所有可能的2D和3D组合。

为此,我想用一个图形来展示,并通过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 个回答

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)

做了这些修改后,在我的控制台里,它似乎能按你预期的那样工作了。

撰写回答