2013-11-04 58 views
4

我有一個爲分散由不同呼叫的散點圖:從具有多個數據集的散點圖中獲取x,y?

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還給即(在這種情況下pp1)還給來自scatter相同PathCollection。 但我找不到任何方式來使用它來提取所選索引的x,y 使用event.artist.get_paths()嘗試 - 但它似乎沒有回報所有的分散點,但只有我點擊的點。所以我真的不知道什麼是event.artist回饋,什麼是event.artist.get_paths()功能回饋

編輯

似乎event.artist._offsets給出了相關的偏移量的數組,但出於某種原因想使用的時候我得到

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

(儘管如果我理解docs,應該還有)

回答

4

要得到x,y座標爲集合scatter回報,使用event.artist.get_offsets()(Matplotlib有大部分是歷史原因明確的getter和setter。所有get_offsets確實是返回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積點。改爲使用plotscatter返回一個集合,它比plot返回的Line2D要難得多。 (如果你去使用plot的路線,你會使用x, y = artist.get_data()。)

最後,不要過多插入我自己的項目,但如果你可能會發現mpldatacursor有用。它抽象了很多你在這裏做的事情。

如果您決定走這條路線,您的代碼將類似於:

+0

謝謝!實際上'mpldatacursor'看起來很不錯,但是我找不到兩件事:1.當我有兩個相鄰的點時,我點擊我只看到一個[I' d想知道有多少點]。 2.有時我想保存這個圖,但是我找不到如何在點擊它後刪除註釋。 – nopede11

+0

@ nopede11 - 對不起,我現在沒有回覆! 1)要顯示點的數量,請使用'datacursor'(formatter = lambda ** kwargs:len(kwargs ['ind']))'(不會顯示x,y位置,但很容易修改格式化程序功能也顯示x,y)。2)使用最新版本,只需按下鍵盤上的「d」鍵即可隱藏註釋框。謝謝! –

+0

對於三維散點圖,有沒有辦法獲得z數據呢? – BenB

相關問題