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:
Domanda interessante. Hai provato a impostare 'alpha' per ogni hexbin? Puoi fare un esempio minimale, completo e verificabile? – farenorth
@Labibah Questo indirizzo sembra interessante, stessa domanda: puoi fare un esempio minimale, completo e verificabile? – rll
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