2011-11-01 15 views
14

W R, istnieje funkcja locator, która jest podobna do Matlaba ginput, gdzie można kliknąć figurę za pomocą myszy i wybrać dowolną współrzędną x, y. Ponadto istnieje funkcja o nazwie identify(x,y), w której jeśli podasz mu zestaw punktów x, y, które wykreśliłeś, a następnie klikniesz na figurę, zwróci indeks punktu x, y, który leży najbliżej (w ramach regulowanej tolerancja) do wybranej lokalizacji (lub wielu wskaźników, jeśli wybrano wiele punktów). Czy istnieje taka funkcjonalność w Matplotlib?matplotlib - interaktywnie wybierz punkty lub lokalizacje?

+1

FWIW: Jest też 'iselect()' w 'pakietu iplots' (dla R). Jest to uogólnienie: obejmuje ono łączenie i szczotkowanie. To samo można zrobić za pomocą funkcji 'get (, 'BrushData')' w Matlabie. – Iterator

+0

Dobrze, a także Rggobi. Ale nie zdawałem sobie sprawy z możliwości Matlaba - ostatnio użyłem go intensywnie w czasach wersji 6.5. Wydaje się, że od tego czasu nabieram ochoty. – hatmatrix

+2

Fancy i drogie. Koszt R również potroił się w ciągu ostatniej dekady, ale nadal jest to okazja. :) – Iterator

Odpowiedz

12

Możesz użyć 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) 

Tolerancja ustawiony przez parametr kompletowania tam:

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

Tak, to jest świetne - dziękuję! – 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

Jeśli importujesz funkcję drukowania z przyszłości, musisz dodać układy: print ('X =' + str (np.take (xdata, ind) [0])) –

Powiązane problemy