2013-09-28 27 views
8

Devo rappresentare circa 30.000 punti in un grafico a dispersione in matplotlib. Questi punti appartengono a due classi diverse, quindi voglio descriverli con colori diversi.Visualizzazione di grafici a dispersione con punti sovrapposti in matplotlib

Sono riuscito a farlo, ma c'è un problema. I punti si sovrappongono in molte regioni e la classe che ritengo per ultima sarà visualizzata sopra l'altra, nascondendola. Inoltre, con il grafico a dispersione non è possibile mostrare quanti punti si trovano in ogni regione. Ho anche provato a creare un istogramma 2d con istogramma 2d e imshow, ma è difficile mostrare i punti appartenenti ad entrambe le classi in modo chiaro.

si può suggerire un modo per chiarire sia la distribuzione delle classi e la concentrazione dei punti?

EDIT: Per essere più chiari, questo è il link al mio file di dati nel formato "x, y, di classe"

+0

Perché non un istogramma con due colori? Non sembra abbastanza buono? –

+0

@OfirIsrael Ho provato ad usare istogramma 2d e imshow con livelli alfa per avere due istogrammi sovrapposti, ma il risultato sembra essere molto scarso – markusian

+0

Hai provato a mostrare gli istogrammi usando il contorno invece del blending alfa? http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.contour – grep

risposta

12

Un approccio è quello di tracciare i dati come un complotto dispersione con un basso alpha, in modo da poter vedere i singoli punti e una misura approssimativa della densità. (Lo svantaggio di questo è che l'approccio ha una gamma limitata di sovrapposizione può mostrare - Per esempio, una densità massima di circa 1/alfa.)

Ecco un esempio:

enter image description here

Come si può immaginare, a causa del numero limitato di sovrapposizioni che si può esprimere, c'è un compromesso tra visibilità dei singoli punti e l'espressione della quantità di sovrapposizione (e la dimensione del marcatore, trama, ecc).

import numpy as np 
import matplotlib.pyplot as plt 

N = 10000 
mean = [0, 0] 
cov = [[2, 2], [0, 2]] 
x,y = np.random.multivariate_normal(mean, cov, N).T 

plt.scatter(x, y, s=70, alpha=0.03) 
plt.ylim((-5, 5)) 
plt.xlim((-5, 5)) 
plt.show() 

(Sto assumendo qui si intende punti 30e3, non 30e6. Per 30e6, penso che un certo tipo di trama densità media sarebbe necessario.)

7

si potrebbe anche colorare i punti dal primo calcolo una stima della densità del kernel della distribuzione della dispersione e utilizzando i valori di densità per specificare un colore per ciascun punto della dispersione. Per modificare il codice nell'esempio precedente:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import gaussian_kde as kde 
from matplotlib.colors import Normalize 
from matplotlib import cm 

N = 10000 
mean = [0,0] 
cov = [[2,2],[0,2]] 

samples = np.random.multivariate_normal(mean,cov,N).T 
densObj = kde(samples) 

def makeColours(vals): 
    colours = np.zeros((len(vals),3)) 
    norm = Normalize(vmin=vals.min(), vmax=vals.max()) 

    #Can put any colormap you like here. 
    colours = [cm.ScalarMappable(norm=norm, cmap='jet').to_rgba(val) for val in vals] 

    return colours 

colours = makeColours(densObj.evaluate(samples)) 

plt.scatter(samples[0], samples[1], color=colours) 
plt.show() 

Scatter plot with density information

ho imparato questo trucco qualche tempo fa, quando ho notato la documentazione della funzione di dispersione -

c : color or sequence of color, optional, default : 'b' 

c può essere una stringa di formato unico colore, o una sequenza di colore specifiche di lunghezza N, o una sequenza di numeri N da mappare a col ors usando cmap e norm specificato tramite kwargs (vedi sotto). Si noti che c non dovrebbe essere un singolo RGB numerico o sequenza RGBA perché è indistinguibile da una matrice di valori da colormapped. c può essere una matrice 2-D in cui le righe sono RGB o RGBA, tuttavia, compreso il caso di una singola riga per specificare lo stesso colore per tutti i punti.

Problemi correlati