从具有多个数据集的散点图中获取x,y?

时间:2013-11-04 13:56:59

标签: python matplotlib plot

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

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似乎回复了PathCollection(本例中为scatterp)提供的p1。 但我找不到任何方法来使用它来提取所选索引的x,y 尝试使用event.artist.get_paths() - 但它似乎没有回馈所有的散点,而只是我点击的那个散点。所以我真的不确定event.artist回馈的是什么什么是event.artist.get_paths()函数回馈

修改

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

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

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

1 个答案:

答案 0 :(得分:4)

要获取scatter返回的集合的x,y坐标,请使用event.artist.get_offsets()(Matplotlib主要有历史原因显示getter和setter。所有get_offsets都返回{{ 1}},但公共接口是通过“getter”。)。

所以,完成你的例子:

self._offsets

但是,如果您没有通过第3或第4变量改变事物,您可能不想使用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() 来绘制点。请改用scatterplot返回的集合比scatter返回的Line2D更难处理。 (如果您选择使用plot的路线,则使用plot。)

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

如果您决定采用该路线,您的代码将类似于: