1

我设置了两个面板 wxPython GUI。在我的右侧面板中,我有一个使用 Basemap 的地图显示。在这张(美国的)底图上,我绘制了不同城市的散点图。我希望能够单击这些点并在我的 GUI 中有一个弹出窗口,提供与我选择的那个点相关的一些信息(例如城市、纬度/经度等——我会存储所有这些信息以列表或其他方式)。

我遇到了 AnnoteFinder,但这似乎在我的 GUI 中不起作用(如果我使用 itelf 的 Basemap 而不是在我的 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()

有什么想法吗?

4

1 回答 1

3

看看这个答案。基本上,您设置了一个在图表上创建注释的选择事件。此注释可以作为工具提示样式的文本框弹出。

请注意,这不会产生真正的 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以获取与所选点对应的城市名称。根据数据的格式,您的代码可能需要稍有不同,但这应该会给您一个想法。

于 2012-06-22T19:10:02.413 回答