2012-06-22 40 views
1

我有一个双面板wxPython GUI设置。在我的右侧面板中,我使用底图来显示地图。在这幅(美国的)底图上,绘制了不同城市的散点图。我希望能够点击这些点,并在我的GUI中弹出一个窗口,提供一些与我选择的点有关的信息(例如City,lat/long等) - 我将存储所有这些信息以列表或其他方式)。在wxPython中弹出matplotlib上的注释

我遇到过AnnoteFinder,但是这似乎并没有在我的GUI中工作(如果我使用底图而不是在我的2面板GUI中,它会工作)。此外,这只是把一些文本放在点的顶部 - 我宁愿有一个小窗口出现。我的代码

例至今:

#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。基本上你设置了一个选择事件,在图上创建一个注释。此注释可以弹出为工具提示样式的文本框。

请注意,这不会产生一个真正的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所述,不同的艺术家类型(即,不同种类的情节)将提供不同的事件信息。

我有一些旧代码几乎完全符合您所描述的内容(点击地图上的某个点时显示城市名称)。我不得不承认,我不记得究竟如何这一切工作,但我的代码有这个在DataCursor:

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获取与选取的点相对应的城市名称。根据数据的格式,您的代码可能需要略有不同,但这应该会给您一个想法。

+0

你可以协助其他代码的最后四行,以及我将如何工作到我的代码上面?我似乎无法弄清楚。谢谢! – mcfly

+0

看到我编辑的答案。 – BrenBarn

+0

太棒了!我得到了这个工作。但是,有没有办法让注释成为给定的x,y之外的东西?例如,对于每个(x,y)散点,我都有一个相关的“城市名称”,我宁愿显示比(x,y)值。我看到它从哪里得到self.x和self.y,我添加self.z?有什么合适的方法来解决这个问题?谢谢! – mcfly