【问题标题】:Matplotlib Radiobutton doesn't work anymore after clf()在 clf() 之后 Matplotlib 单选按钮不再起作用
【发布时间】:2014-03-19 13:12:37
【问题描述】:

我正在绘制超过 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()

这个例子展示了轴是如何在你第一次点击按钮时完美改变的,但从那时起按钮就不再响应了。

【问题讨论】:

  • 你能把这个减少到最小版本来复制问题吗?这里有太多与您的问题无关的代码。人们愿意提供帮助,但可能不愿意彻底整理那么多杂物。

标签: python matplotlib widget radio-button interactive


【解决方案1】:

我猜问题是在您的“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)

通过这些修改,它似乎可以在我的控制台中按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-17
    • 2017-01-01
    • 2017-07-15
    • 2021-11-10
    • 2015-11-15
    • 2016-01-06
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多