2014-12-02 18 views
7

Vorrei verificare a livello di codice se due glifi di scatterplot si sovrappongono in matplotlib. Così dato una coppia di (x, y) coordina e una dimensione (che come ho capito è l'area del cerchio, in punti), desidero tracciareCome posso convertire da dimensioni scatter a coordinate dati in matplotlib?

plt.scatter(x, y, s=s) 

e quindi hanno una funzione chiamata points_overlap che prende questi parametri e restituisce True se i punti si sovrappongono e False altrimenti.

def points_overlap(x, y, s): 
    if ... 
     return True 
    else: 
     return False 

So che ci sono di trasformazione matrici di portarmi tra le diverse matplotlib coordinate systems, ma non riesco a capire i passi giusti per la scrittura di questa funzione.

+0

solo uno sparo nel buio, ma sembra possibile che le parti responsabili dietro "beeswarm" ne sappiano una o due su questo. (http://nbviewer.ipython.org/github/mgymrek/pybeeswarm/blob/master/beeswarm_example.ipynb) –

+0

Per quanto posso dire dal codice pybeeswarm, la dimensione e l'offset dei punti di dispersione è un parametro per funzione e richiede alcuni tentativi ed errori per allineare le cose. Quindi questa domanda :) – mwaskom

+0

Dang - Speravo che lo avessero capito. –

risposta

2

Ciò richiede alcuni test, ma potrebbe funzionare? Questi dovrebbero essere tutti nello spazio di visualizzazione

def overlap(x, y, sx, sy): 
    return np.linalg.norm(x - y) < np.linalg.norm(sx + sy) 

prova:

In [227]: X = np.array([[1, 1], [2, 1], [2.5, 1]]) 
In [228]: s = np.array([20, 10000, 10000]) 

In [229]: fig, ax = plt.subplots() 

In [230]: ax.scatter(X[:, 0], X[:, 1], s=s) 
Out[230]: <matplotlib.collections.PathCollection at 0x10c32f28> 

In [231]: plt.draw() 

prova ogni coppia:

Xt = ax.transData.transform(X) 
st = np.sqrt(s) 

pairs = product(Xt, Xt) 
sizes = product(st, st) 

for i, ((x, y), (sx, sy)) in enumerate(zip(pairs, sizes)): 
    h = i % 3 
    j = i // 3 
    if h != j and overlap(x, y, sx, sy): 
     print((i, h, j)) 

enter image description here

c'è un sacco di spazio per ulteriori miglioramenti. Probabilmente è più semplice trasformare tutti i tuoi dati e trasferirli nella funzione points_overlap invece di eseguire la trasformazione all'interno. Sarebbe molto meglio in realtà.

+0

Questo sembra vicino ma non del tutto lì. Vedi il blocco [this] (http://nbviewer.ipython.org/gist/mwaskom/000cb7d78e8ea6ac286b) per altri test. – mwaskom

Problemi correlati