matplotlib:在重绘之前清除散点图数据

时间:2012-08-12 00:55:31

标签: matplotlib scatter-plot

我有一个散点图,在一个imshow(地图)上。 我想要一个click事件来添加一个新的散点,我用scater(newx,newy)来完成。麻烦的是,我想添加使用pick事件删除点的能力。由于没有删除(pickX,PickY)函数,我必须获取所选索引并将其从列表中删除,这意味着我无法像上面那样创建我的分散,我必须分散(allx,ally)。

所以底线是我需要一种方法来删除散点图并用新数据重绘它,而不改变我的imshow的存在。我尝试过并尝试过: 只是一次尝试。

 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和轴:(。 任何实现我的梦想的方法都非常感激。 安德鲁

1 个答案:

答案 0 :(得分:2)

首先,您应该好好阅读events docs here

您可以附加一个在单击鼠标时调用的函数。如果您维护一个可以选择的艺术家列表(在这种情况下为点),那么您可以询问鼠标点击事件是否在艺术家内部,并调用艺术家的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()

enter image description here

希望这可以帮助您实现梦想。 : - )