2013-11-15 2 views
0

그래서 오류는 TypeError: 'PolyCollection' object is not callable입니다. 어떻게 해결할 수 있습니까?'PolyCollection'개체를 호출 할 수 없습니다.

Tkinter를 사용하여 표시되는 Python 및 Matplotlib로 동적으로 업데이트되는 막대 그래프를 만들려고합니다. 아래 코드에서 알 수 있듯이 Matplotlib의 hexbin 함수를 사용하여 여러 목록을 전달하여 그래프를 만들었습니다. 나이, 무게 및 높이. 제가 작성한 UpdateGraph 메소드는 새로운 데이터가 그래프로 표시 될 준비가되었는지 확인하기 위해 별도의 thread에 생성 된 무한 루프입니다. 그럴 경우 다시 main thread으로 점프하고 그래프를 지우고 데이터를 플롯하고 축 제목을 다시 추가 한 다음 캔버스를 그려서 그래프를 업데이트합니다. 그래프의

창조 (I이 모두 확인하고 문제가 발생하지 않습니다 확신 해요.)

#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 

참고 : 모든 코드는 위의 단지 샘플입니다. 오타가 있으면 실제 코드에 존재하지 않습니다. 내가 데이터를 그래프로 메인 스레드로 다시 이동해야 가정

하지만 취소하고 플롯 할 수있는 기능 전에 root.add_idle을 추가 어떤 이유로 데이터가 불필요 -

답변

0

나는 문제가 무엇인지 발견 문제를 일으켰습니다.

수정 코드

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) 
관련 문제