1

2つのパネルのwxPythonGUIをセットアップしました。右側のパネルには、ベースマップを使用したマップ表示があります。(米国の)このベースマップに、さまざまな都市の散布図をプロットします。これらのドットをクリックして、GUI内にポップアップウィンドウを表示し、選択したドットに関連する情報(City、lat / longなど)を表示できるようにしたいと思います。この情報はすべて保存されます。リストまたは他の手段で)。

AnnoteFinderに出くわしましたが、これはGUI内では機能しないようです(2パネルGUIではなくitelfで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()

何かご意見は?

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 に答える