2011-11-01 29 views
14

Trong R, có chức năng locator giống như của Matlab ginput nơi bạn có thể nhấp vào hình bằng chuột và chọn bất kỳ tọa độ x, y nào. Ngoài ra, có một hàm gọi là identify(x,y), nếu bạn đặt cho nó một tập hợp các điểm x, y mà bạn đã vẽ và sau đó nhấp vào hình, nó sẽ trả về chỉ số của điểm x, y nằm gần nhất (trong một điều chỉnh dung sai) đến vị trí bạn đã chọn (hoặc nhiều chỉ mục, nếu chọn nhiều điểm). Có một chức năng như vậy trong Matplotlib?matplotlib - tương tác chọn điểm hoặc địa điểm?

+1

FWIW: Ngoài ra còn có 'iselect() 'trong' gói iplots' (cho R). Đây là một khái quát: nó liên quan đến việc liên kết và đánh răng. Điều tương tự có thể được thực hiện thông qua hàm 'get (, 'BrushData')' trong Matlab. – Iterator

+0

Phải và Rggobi. Nhưng tôi đã không nhận thức được khả năng của Matlab cho điều này - lần cuối cùng tôi sử dụng nó mạnh mẽ đã trở lại trong những ngày của phiên bản 6.5. Dường như đã nhận được ưa thích kể từ đó. – hatmatrix

+2

Ưa thích và đắt tiền. Chi phí của R cũng tăng gấp ba lần trong thập kỷ qua, nhưng nó vẫn là một món hời. :) – Iterator

Trả lời

12

Bạn có thể muốn sử dụng một 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) 

Tolerance được thiết lập bởi tham số bảng chọn có:

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

Vâng, điều này thật tuyệt - cảm ơn bạn! – 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

Nếu bạn nhập chức năng in từ tương lai, bạn phải thêm các bộ đệm: in ('X =' + str (np.take (xdata, ind) [0])) –

Các vấn đề liên quan