4

我有一个散点图,它由对scatter的不同调用组成:

import matplotlib.pyplot as plt
import numpy as np

def onpick3(event):
    index = event.ind
    print '--------------'
    print index
    artist = event.artist
    print artist

fig_handle = plt.figure()

x,y = np.random.rand(10),np.random.rand(10)
x1,y1 = np.random.rand(10),np.random.rand(10)

axes_size = 0.1,0.1,0.9,0.9
ax = fig_handle.add_axes(axes_size)

p = ax.scatter (x,y, marker='*', s=60, color='r', picker=True, lw=2)
p1 = ax.scatter (x1,y1, marker='*', s=60, color='b', picker=True, lw=2)

fig_handle.canvas.mpl_connect('pick_event', onpick3)
plt.show()

我希望这些点是可点击的,并获得所选索引的 x,y。但是,由于scatter被多次调用,我得到了两次相同的索引,所以我不能x[index]onpick3方法中使用

有没有直接的方法来获得积分?

似乎event.artist回馈的回报PathCollectionscatter(在这种情况下)给予的相同。但我找不到任何方法来使用它来提取尝试使用的所选索引的- 但它似乎并没有返回所有散点,而只是我点击的那个..所以我真的不知道什么是回馈,什么是功能回馈pp1x,yevent.artist.get_paths()event.artistevent.artist.get_paths()

编辑

似乎event.artist._offsets给出了一个具有相关偏移量的数组,但由于某种原因,在尝试使用时event.artist.offsets我得到了

AttributeError: 'PathCollection' object has no attribute 'offsets'

(虽然如果我理解文档,它应该在那里)

4

1 回答 1

5

要获取scatter返回的集合的 x、y 坐标,请使用event.artist.get_offsets()(Matplotlib 具有显式的 getter 和 setter,主要是出于历史原因。所有get_offsets的都是 return self._offsets,但公共接口是通过“getter”。)。

因此,要完成您的示例:

import matplotlib.pyplot as plt
import numpy as np

def onpick3(event):
    index = event.ind
    xy = event.artist.get_offsets()
    print '--------------'
    print xy[index]


fig, ax = plt.subplots()

x, y = np.random.random((2, 10))
x1, y1 = np.random.random((2, 10))

p = ax.scatter(x, y, marker='*', s=60, color='r', picker=True)
p1 = ax.scatter(x1, y1, marker='*', s=60, color='b', picker=True)

fig.canvas.mpl_connect('pick_event', onpick3)
plt.show()

但是,如果您没有通过第三个或第四个变量来改变事物,您可能不想用来scatter绘制点。改为使用plot。返回一个比返回scatter的更难处理的集合。(如果你确实走使用的路线,你会使用。)Line2Dplotplotx, y = artist.get_data()

最后,不要过多地插入我自己的项目,但如果你觉得mpldatacursor有用的话。它抽象了你在这里做的很多事情。

如果您决定走这条路,您的代码将类似于:

于 2013-11-04T19:47:20.003 回答