2017-05-02 3 views
0

Ich habe ein Python-Skript, das viele (n) Zeilen mit jeweils 10 Punkten zeichnet, und ich versuche es so zu machen, dass ich auf eine Zeile klicken kann Es wird die ID der Linie und die ID des Punktes in der Linie gedruckt. Bisher habe ich diese bekam:Wie man NUR einen Punkt in Matplotlib auswählt pick_event

def onpick(event): 
    ind = event.ind 
    s = event.artist.get_gid() 
    print s, ind 

#x and y are n x 10 arrays 
#s is the id of the line 
for s in range(n): 
    ax.plot(x[s,:],y[s,:],'^',color=colors(s),picker=2,gid=str(s)) 

Das funktioniert gut und gibt mir ein Grundstück ein bisschen wie diese (ich zuvor legte die farbigen Kästchen und colorbar anstelle als Referenz): scatter plot of points

ich kann klicken sie auf einen Punkt und druckt es so etwas wie

1 [1] 

** Das Problem ist dieses - ** wenn ich zwischen zwei Punkten klicken, die sehr nahe sind es druckt

0 [2 3] 

oder ähnlich. Ich kann den "Picker" Abstand nicht weiter reduzieren, weil es sehr schwierig ist, die Maus in die genau richtige Position zu bringen, um einen Punkt auszuwählen.

Was ich möchte ist eine Möglichkeit, die Auswahl zu beschränken, um NUR der nächste Punkt zu sein. Irgendwelche Ideen?

Antwort

1

Wenn Sie nur den Index des nächsten Punkts drucken möchten, müssen Sie herausfinden, welcher davon am ehesten dem Mausereignis entspricht.

Die Position des Mausereignisses in Datenkoordinaten wird über event.mouseevent.xdata (oder ydata) abgerufen. Dann muss die Entfernung berechnet werden und der Index des Punktes, der am nächsten ist, kann zurückgegeben werden.

import numpy as np; np.random.seed(1) 
import matplotlib.pyplot as plt 

x = np.logspace(1,10,base=1.8) 
y = np.random.rayleigh(size=(2,len(x))) 

def onpick(event): 
    ind = event.ind 
    if len(ind) > 1: 
     datax,datay = event.artist.get_data() 
     datax,datay = [datax[i] for i in ind],[datay[i] for i in ind] 
     msx, msy = event.mouseevent.xdata, event.mouseevent.ydata 
     dist = np.sqrt((np.array(datax)-msx)**2+(np.array(datay)-msy)**2) 
     ind = [ind[np.argmin(dist)]] 
    s = event.artist.get_gid() 
    print s, ind 

colors=["crimson","darkblue"] 
fig,ax = plt.subplots() 
for s in range(2): 
    ax.plot(x,y[s,:],'^',color=colors[s],picker=2,gid=str(s)) 

fig.canvas.mpl_connect("pick_event", onpick) 

plt.show() 
Verwandte Themen