2013-11-15 3 views
0

Так что ошибка, которую я получаю, - TypeError: 'PolyCollection' object is not callable. Как это исправить?Объект «PolyCollection» не может быть вызван

Я пытаюсь создать динамически обновленную гистограмму с помощью 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) 

Update Graph Метод

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 

Примечание: Все выше код просто образец. Если есть опечатки, они не существуют в моем фактическом коде.

ответ

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) 
Смежные вопросы