2

私はimshow(マップ)の上に散布図を持っています。scater(newx,newy)) で行った新しいスキャッタ ポイントを追加するクリック イベントが必要です。問題は、ピック イベントを使用してポイントを削除する機能を追加することです。remove(pickX,PickY) 関数がないため、選択したインデックスを取得してリストから削除する必要があります。つまり、上記のようにスキャッターを作成することはできません。

要するに、imshow の存在を変更せずに、散布図を削除して新しいデータで再描画する方法が必要です。私は試してみました:たった1回の試みです。

 fig = Figure()
 axes = fig.add_subplot(111)
 axes2 = fig.add_subplot(111)
 axes.imshow(map)
 axes2.scatter(allx,ally)
 # and the redraw
 fig.delaxes(axes2)
 axes2 = fig.add_subplot(111)
 axes2.scatter(NewscatterpointsX,NewscatterpointsY,picker=5)
 canvas.draw()

驚いたことに、これは私の imshow と斧も不要にしました :(. 私の夢を達成するためのあらゆる方法は大歓迎です. アンドリュー

4

1 に答える 1

2

まず、こちらのイベント ドキュメントをよく読んでおく必要があります。

マウスがクリックされるたびに呼び出される関数をアタッチできます。選択できるアーティスト (この場合はポイント) のリストを保持している場合、マウス クリック イベントがアーティスト内にあるかどうかを確認し、アーティストのremoveメソッドを呼び出すことができます。そうでない場合は、新しいアーティストを作成して、クリック可能なポイントのリストに追加できます。

import matplotlib.pyplot as plt

fig = plt.figure()
ax = plt.axes()

ax.set_xlim(0, 1)
ax.set_ylim(0, 1)

pickable_artists = []
pt, = ax.plot(0.5, 0.5, 'o')  # 5 points tolerance
pickable_artists.append(pt)


def onclick(event):
    if event.inaxes is not None and not hasattr(event, 'already_picked'):
        ax = event.inaxes

        remove = [artist for artist in pickable_artists if artist.contains(event)[0]]

        if not remove:
            # add a pt
            x, y = ax.transData.inverted().transform_point([event.x, event.y])
            pt, = ax.plot(x, y, 'o', picker=5)
            pickable_artists.append(pt)
        else:
            for artist in remove:
                artist.remove()
        plt.draw()


fig.canvas.mpl_connect('button_release_event', onclick)

plt.show()

ここに画像の説明を入力

これがあなたの夢の実現に役立つことを願っています。:-)

于 2012-08-12T19:06:31.760 に答える