' PolyCollection'对象不可调用

时间:2013-11-15 18:15:47

标签: python python-2.7 matplotlib tkinter

所以我得到的错误是TypeError: 'PolyCollection' object is not callable如何解决此问题?

我正在尝试用Python和Matplotlib创建一个动态更新的直方图,使用Tkinter显示。正如您在下面的代码中看到的,我使用Matplotlib的hexbin函数通过传入多个列表来创建图形;年龄,体重和身高。我创建的UpdateGraph方法是在单独的thread上生成的无限循环,它检查新数据是否已准备好绘制。如果是,则跳回main thread并通过清除图表,绘制数据,添加轴标题然后绘制画布来更新图形。

创建图表(我很确定这一切都没问题,也没有造成任何问题。)

#avh = Age Vs Height
#wvh = Weight Vs Height

self.xLimit = (0,8)
self.avhYLimit = (0,99)
self.wvhYLimit = (0,300)
self.avhExtent = self.xLimit + self.avhYLimit
self.wvhExtent = self.xLimit + self.wvhYLimit

self.avhGraphFrame = Frame(frame)
self.avhGraphFrame.grid(row = 0, column = 0, sticky = N+S+E+W)
self.avhFigure = matplotlib.figure.Figure(figsize = (7,5), frameon = False)
self.avhCanvas = FigureCanvasTkAgg(self.avhfigure , master = self.avhGraphFrame)
self.avhPlot = self.avhFigure.add_subplot(111)
self.avhPlot.set_xlim(self.xLimit)
self.avhPlot.set_ylim(self.avhYLimit )
self.avhCanvas.get_tk_widget().pack(side = Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)

self.wvhGraphFrame = Frame(frame)
self.wvhGraphFrame.grid(row = 3, column = 1, columnspan = 2, sticky = N+S+E+W)
self.wvhFigure = matplotlib.figure.Figure(figsize = (7,5), frameon = False)
self.wvhCanvas = FigureCanvasTkAgg(self.wvhFigure , master = self.wvhGraphFrame)
self.wvhPlot = self.wvhFigure.add_subplot(111)
self.wvhPlot.set_xlim(self.xLimit)
self.wvhPlot.set_ylim(self.wvhExtent)
self.wvhCanvas.get_tk_widget().pack(side = Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)

更新图表方法

def UpdateGraphs(self):
    while True:
        dataFinalIndex = len(self.mainController.PDWs)

        ages    = []
        weights = []
        heights = []

        for person in self.persons:
            ages.append(person.age)
            weights.append(person.weight)
            heights.append(person.height)

        root.after_idle(self.avhplot.clear)
        root.after_idle(self.wvhPlot.clear)

        """ Here is where the error comes from"""
        root.after_idle(self.avhplot.hexbin(heights, ages, cmap = matplotlib.cm.jet,
                                            mincnt = 1, bins = "log", extent = self.avhExtent))
        root.after_idle(self.avhplot.hexbin(heights, weights, cmap = matplotlib.cm.jet,
                                            mincnt = 1, bins = "log", extent = self.wvhExtent))
        """             End of Error          """

        root.after_idle(self.avhPlot.set_ylabel, ("Ages")
        #The rest of the labels are set like this as well

        root.after_idle(self.avhCanvas.draw)
        root.after_idle(self.wvhCanvas.draw)

当我尝试绘制数据时,错误会被抛出。我不知道为什么会这样,因为这在过去是有效的。奇怪的是,它会首次绘制数据(即使有错误),但不是第二次。

堆栈跟踪

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 495, in callit
    func(*args)
TypeError: 'PolyCollection' object is not callable

注意:上面的所有代码都只是示例。如果有任何拼写错误,则在我的实际代码中它们不存在。

1 个答案:

答案 0 :(得分:0)

我发现了问题所在 -

我假设我需要跳回主线程来绘制数据图形,但由于某些原因,在清除和绘制数据的函数之前添加root.add_idle是不必要的并导致问题。

更正后的代码

    self.avhplot.hexbin(heights, ages, cmap = matplotlib.cm.jet,
                                        mincnt = 1, bins = "log", extent = self.avhExtent)
    self.avhplot.hexbin(heights, weights, cmap = matplotlib.cm.jet,
                                        mincnt = 1, bins = "log", extent = self.wvhExtent)