2011-11-01 111 views
14

在R中,有一個功能locator,它與Matlab的ginput類似,您可以用鼠標單擊圖形並選擇任何x,y座標。另外,還有一個叫做identify(x,y)的函數,如果你給它一組已繪製的點x,y,然後單擊該圖,它將返回最接近的x,y點的索引(在一個可調容差)到您選擇的位置(或多個指標,如果選擇多個點)。 Matplotlib中有這樣的功能嗎?matplotlib - 交互式選擇點或位置?

+1

FWIW:還有'I選擇()'的'iplots'包(對於R)。這是一個泛化:它涉及到連接和刷牙。同樣可以通過Matlab中的get(,'BrushData')函數完成。 – Iterator

+0

對,還有Rggobi。但是我沒有意識到Matlab的這種能力 - 上次我使用它的時間已經回到了6.5版本的時代。似乎從那時起已經變得奇特。 – hatmatrix

+2

花式和昂貴。在過去的十年裏,R的成本也增加了兩倍,但它仍然是一個便宜貨。 :) – Iterator

回答

12

您可能需要使用一個pick event

fig = figure() 
ax1 = fig.add_subplot(111) 
ax1.set_title('custom picker for line data') 
line, = ax1.plot(rand(100), rand(100), 'o', picker=line_picker) 
fig.canvas.mpl_connect('pick_event', onpick2) 

公差通過選擇器參數有設置:

line, = ax1.plot(rand(100), 'o', picker=5) # 5 points tolerance 
+0

是的,這是偉大的 - 謝謝你! – hatmatrix

5
from __future__ import print_function 
import matplotlib.pyplot as plt 
from matplotlib.lines import Line2D 
from matplotlib.patches import Rectangle 
from matplotlib.text import Text 
from matplotlib.image import AxesImage 
import numpy as np 
from numpy.random import rand 

if 1: 
    fig, ax = plt.subplots() 
    ax.set_title('click on points', picker=True) 
    ax.set_ylabel('ylabel', picker=True, bbox=dict(facecolor='red')) 
    line, = ax.plot(rand(100), 'o', picker=5) 

    def onpick1(event): 
     if isinstance(event.artist, Line2D): 
      thisline = event.artist 
      xdata = thisline.get_xdata() 
      ydata = thisline.get_ydata() 
      ind = event.ind 
      print 'X='+str(np.take(xdata, ind)[0]) # Print X point 
      print 'Y='+str(np.take(ydata, ind)[0]) # Print Y point 

    fig.canvas.mpl_connect('pick_event', onpick1) 
+2

如果你從將來導入打印函數,你必須添加brakets:print('X ='+ str(np.take(xdata,ind)[0])) –