在wxPython中弹出matplotlib上的注释

时间:2012-06-22 18:52:17

标签: python annotations matplotlib wxpython matplotlib-basemap

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

我遇到了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()

有什么想法?

1 个答案:

答案 0 :(得分: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将其编入索引,以获取与所选城市相对应的城市名称。您的代码可能需要略有不同,具体取决于您的数据格式,但这应该会让您有所了解。