Лично я думаю, что ваше решение от kdeplot неплохое (хотя я бы немного поработал над частями, где перехватывались кластеры). В любом случае в качестве ответа на ваш вопрос вы можете указать минимальный счет для hexbin (оставив все пустые ячейки прозрачными). Вот небольшая функция для создания случайных кластеров для всех, кто может захотеть провести некоторые эксперименты (в комментариях ваш вопрос, похоже, вызвал большой интерес у пользователей, не стесняйтесь использовать его):
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
, используя этот код, я создал несколько кластеров и нанес их на график с помощью диаграммы рассеяния (обычно я использую это для своего собственного кластерного анализа, но я думаю, что мне следует взглянуть на Seaborn), hexbin, imshow (изменить на pcolormesh для большего контроля) и контур:
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()
, результат следующий:
25.03.2016