2011-11-01 40 views
14

En R, hay una función locator que es como ginput de Matlab donde puede hacer clic en la figura con un mouse y seleccionar cualquier coordenada x, y. Además, hay una función llamada identify(x,y) donde si le das un conjunto de puntos x, y que has trazado y luego haces clic en la figura, devolverá el índice del punto x, y que está más cerca (dentro de un tolerancia) a la ubicación que ha seleccionado (o múltiples índices, si se seleccionan múltiples puntos). ¿Hay tal funcionalidad en Matplotlib?matplotlib: selecciona interactivamente puntos o ubicaciones?

+1

Fwiw: También hay 'iselect()' en el paquete 'iplots' (para R). Esta es una generalización: implica vincular y cepillar. Lo mismo se puede hacer a través de la función 'get (, 'BrushData')' en Matlab. – Iterator

+0

Derecha, y Rggobi también. Pero no estaba al tanto de la capacidad de Matlab para esto, la última vez que lo usé intensamente fue en los días de la versión 6.5. Parece haberse vuelto elegante desde entonces. – hatmatrix

+2

Elegante y caro. El costo de R también se ha triplicado en la última década, pero sigue siendo una ganga. :) – Iterator

Respuesta

12

Es posible que desee utilizar un pick event: Tolerancia

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) 

establecido por el parámetro selector de allí:

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

Sí, esto es genial, ¡gracias! – 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

Si importa la función de impresión del futuro, debe agregar los corchetes: print ('X =' + str (np.take (xdata, ind) [0])) –

Cuestiones relacionadas