1

두 패널 wxPython GUI가 설정되었습니다. 오른쪽 패널에는 Basemap을 사용하여 맵 디스플레이가 있습니다. 이 basemap (미국)에서 나는 다른 도시의 산란 음모를 그렸다. 이 도트를 클릭하고 내가 선택한 점 (예 : 도시, 위도/경도 등)에 상대적인 정보를 제공하는 GUI 내 창을 팝업으로 표시하고 싶습니다. -이 모든 정보를 저장해야합니다. 목록 또는 다른 수단으로).wxPython 내에서 matplotlib에 주석 달기

나는 AnnoteFinder를 보았지만 내 GUI에서는 작동하지 않는 것 같습니다. (필자는 2 개의 패널 GUI가 아닌 자체적으로 basemap을 사용합니다.) 또한 이것은 점의 꼭대기에 텍스트를 넣는 것입니다. 저는 작은 창이 나타나기 쉽습니다. 지금까지 내 코드의

예 :

#Setting up Map Figure 
self.figure = Figure(None,dpi=75) 
self.canvas = FigureCanvas(self.PlotPanel, -1, self.figure) 
self.axes = self.figure.add_axes([0,0,1,1],frameon=False) 
self.SetColor((255,255,255)) 

#Basemap Setup 
self.map = Basemap(llcrnrlon=-119, llcrnrlat=22, urcrnrlon=-64, 
        urcrnrlat=49, projection='lcc', lat_1=33, lat_2=45, 
        lon_0=-95, resolution='h', area_thresh=10000,ax=self.axes) 
self.map.drawcoastlines() 
self.map.drawcountries() 
self.map.drawstates() 
self.figure.canvas.draw() 

#Set up Scatter Plot 
m = Basemap(llcrnrlon=-119, llcrnrlat=22, urcrnrlon=-64, 
      urcrnrlat=49, projection='lcc', lat_1=33, lat_2=45, 
      lon_0=-95, resolution='h', area_thresh=10000,ax=self.axes) 

x,y=m(Long,Lat) 

#Scatter Plot (they plot the same thing) 
self.map.plot(x,y,'ro') 
self.map.scatter(x,y,90) 

self.figure.canvas.draw() 

어떤 생각?

답변

2

체크 아웃 this answer. 기본적으로 그래프에 주석을 만드는 pick 이벤트를 설정합니다. 이 주석은 툴팁 스타일의 텍스트 상자로 팝업 될 수 있습니다.

실제 GUI "창"(즉, 닫기 버튼, 제목 표시 줄 등이있는 대화 상자 또는 기타 컨트롤)이 아니라 플롯 자체의 주석 만 생성된다는 점에 유의하십시오. 그러나 코드를 살펴보면 클릭 한 아티스트 (예 : 점)가 어떻게 결정되는지 확인할 수 있습니다. 일단 그 정보가 있으면 주석으로 대신 wxPython 대화 상자를 만드는 등 원하는 코드를 실행할 수 있습니다.

편집 지난 몇 라인에 관한 질문 재 :

pts = self.map.scatter(x, y, 90) 
self.figure.canvas.mpl_connect('pick_event', DataCursor(plt.gca())) 
pts.set_picker(5) 

또 다른 편집을 질문 재에서 다른 텍스트를하는 것에 대한 : 코드를 기반으로, 그것은 당신이 원하는 것처럼 보인다 주석 : 원하는 정보를 추출하려면 이벤트 객체를 가지고 놀아야 할 수도 있습니다. http://matplotlib.sourceforge.net/users/event_handling.html#simple-picking-example에 설명 된 바와 같이, 상이한 아티스트 유형 (즉, 상이한 종류의 플롯)은 상이한 이벤트 정보를 제공 할 것이다.

필자가 묘사 한 것과 거의 똑같은 오래된 코드를 가지고 있습니다 (지도상의 한 점을 클릭하면 도시 이름이 표시됩니다).

def __call__(self, event): 
    self.event = event 
    xdata, ydata = event.artist._offsets[:,0], event.artist._offsets[:,1] 
    #self.x, self.y = xdata[event.ind], ydata[event.ind] 
    self.x, self.y = event.mouseevent.xdata, event.mouseevent.ydata 
    if self.x is not None: 
     city = clim['Name'][event.ind[0]] 
     if city == self.annotation.get_text() and self.annotation.get_visible(): 
      # You can click the visible annotation to remove it 
      self.annotation.set_visible(False) 
      event.canvas.draw() 
      return 
     self.annotation.xy = self.x, self.y 
     self.annotation.set_text(city) 
     self.annotation.set_visible(True) 
     event.canvas.draw() 

clim['Name'] 도시 이름의 목록입니다, 나는 그 event.ind를 사용하여로 색인 할 수 있었다 : 나는 그것의 모든 작동하지만, 내 코드가 DataCursor이를 얼마나 내가 정확히 기억하지 인정해야 선택된 지점에 해당하는 도시 이름을 가져옵니다. 코드 형식에 따라 코드가 약간 다를 수 있지만 아이디어가 있어야합니다.

+0

다른 코드의 마지막 네 줄을 도울 수 있으며 위 코드에서 어떻게 작동합니까? 나는 그것을 알아낼 것 같지 않습니다. 감사! – mcfly

+0

내 수정 된 답변보기 – BrenBarn

+0

좋아요! 이 일을해야 해. 그렇지만 주석을 주어진 x, y 이외의 다른 것으로 사용하는 방법이 있습니까? 예를 들어, 각 (x, y) 분산 점에 대해 (x, y) 값보다 오히려 표시 할 연관 '도시 이름'이 있습니다. 나는 그것이 self.x와 self.y가되는 곳을보고, self.z를 추가합니까? 이것에 접근하는 적절한 방법은 무엇입니까? 감사! – mcfly