2015-07-20 13 views
12

Sto facendo alcuni KMean in cluster su un set di dati grande e molto denso e sto cercando di capire il modo migliore per visualizzare i cluster.sovrapponi più insiemi di dati con hexbin

In 2D, sembra che hexbin faccia un buon lavoro ma non riesco a sovrastampare i cluster sulla stessa cifra. Voglio usare hexbin separatamente su ciascuno dei cluster con una mappa di colori diversa per ciascuno, ma per qualche motivo questo non sembra funzionare. L'immagine mostra ciò che ottengo quando provo a tracciare un secondo e un terzo set di dati.

Qualche suggerimento su come procedere? enter image description here

Dopo un po 'giocherellare, sono stato in grado di fare questo con Seaborn's kdeplot

enter image description here

+4

Domanda interessante. Hai provato a impostare 'alpha' per ogni hexbin? Puoi fare un esempio minimale, completo e verificabile? – farenorth

+1

@Labibah Questo indirizzo sembra interessante, stessa domanda: puoi fare un esempio minimale, completo e verificabile? – rll

+0

Sono d'accordo con @farenorth. Puoi pubblicare/creare un set di dati falso con numeri casuali (formattato come è dopo aver completato il clustering) insieme al tuo codice di tracciamento. Sarà molto più veloce per gli altri giocare con ... – tmthydvnprt

risposta

3

Personalmente penso che la soluzione da kdeplot è abbastanza buona (anche se avrei lavorato un po' sulle parti erano ammassi di intercettazione). In ogni caso come risposta alla tua domanda puoi fornire un conteggio minimo a hexbin (lasciando tutte le celle vuote come trasparenti). Ecco una piccola funzione per la produzione di cluster casuali per tutti coloro che potrebbero desiderare di fare alcuni esperimenti (nei commenti la tua domanda sembrava di costruire un sacco di interesse da parte degli utenti, è caduto liberamente per usarlo):

import numpy as np 
import matplotlib.pyplot as plt 

# Building random clusters 
def cluster(number): 
    def clusterAroundX(a,b,number): 
     x = np.random.normal(size=(number,)) 
     return (x-x.min())*(b-a)/(x.max()-x.min())+a 
    def clusterAroundY(x,m,b): 
     y = x.copy() 
     half = (x.max()-x.min())/2 
     middle = half+x.min() 
     for i in range(x.shape[0]): 
      std = (x.max()-x.min())/(2+10*(np.abs(middle-x[i])/half)) 
      y[i] = np.random.normal(x[i]*m+b,std) 
     return y + np.abs(y.min()) 
    m,b = np.random.randint(-700,700)/100,np.random.randint(0,50) 
    print(m,b) 
    f = np.random.randint(0,30) 
    l = f + np.random.randint(10,50) 
    x = clusterAroundX(f,l,number) 
    y = clusterAroundY(x,m,b) 
    return x,y 

, usando questo codice Ho prodotto alcuni cluster e li ho tracciati con scatterplot (di solito uso questo per la mia analisi cluster, ma suppongo che dovrei dare un'occhiata a seaborn), hexbin, imshow (cambia per pcolormesh per un maggiore controllo) e contour:

clusters = 5 
samples = 300 
xs,ys = [],[] 
for i in range(clusters): 
    x,y = cluster(samples) 
    xs.append(x) 
    ys.append(y) 

# SCATTERPLOT 
alpha = 1 
for i in range(clusters): 
    x,y = xs[i],ys[i] 
    color = (np.random.randint(0,255)/255,np.random.randint(0,255)/255,np.random.randint(0,255)/255) 
    plt.scatter(x,y,c = color,s=90,alpha=alpha) 
plt.show() 

# HEXBIN 
# Hexbin seems a bad choice because I think you cant control the size of the hexagons. 
alpha = 1 
cmaps = ['Reds','Blues','Purples','Oranges','Greys'] 
for i in range(clusters): 
    x,y = xs[i],ys[i] 
    plt.hexbin(x,y,gridsize=20,cmap=cmaps.pop(),mincnt=1) 
plt.show() 

# IMSHOW 
alpha = 1 
cmaps = ['Reds','Blues','Purples','Oranges','Greys'] 
xmin,xmax = min([i.min() for i in xs]), max([i.max() for i in xs]) 
ymin,ymax = min([i.min() for i in ys]), max([i.max() for i in ys]) 
nums = 30 
xsize,ysize = (xmax-xmin)/nums,(ymax-ymin)/nums 
im = [np.zeros((nums+1,nums+1)) for i in range(len(xs))] 
def addIm(im,x,y): 
    for i,j in zip(x,y): 
     im[i,j] = im[i,j]+1 
    return im 
for i in range(len(xs)): 
    xo,yo = np.int_((xs[i]-xmin)/xsize),np.int_((ys[i]-ymin)/ysize) 
    #im[i][xo,yo] = im[i][xo,yo]+1 
    im[i] = addIm(im[i],xo,yo) 
    im[i] = np.ma.masked_array(im[i],mask=(im[i]==0)) 
for i in range(clusters): 
    # REPLACE BY pcolormesh if you need more control over image locations. 
    plt.imshow(im[i].T,origin='lower',interpolation='nearest',cmap=cmaps.pop()) 
plt.show() 

# CONTOURF 
cmaps = ['Reds','Blues','Purples','Oranges','Greys'] 
for i in range(clusters): 
    # REPLACE BY pcolormesh if you need more control over image locations. 
    plt.contourf(im[i].T,origin='lower',interpolation='nearest',cmap=cmaps.pop()) 
plt.show() 

, il risultato sono i folloing:

scatterplot clusters

hexbin clusters

imshow clusters

countourf clusters

Problemi correlati