2016-12-24 80 views
1

我有要聚类成K个聚类的2D数据。让我们假设K=4。运行聚类算法后,每个点有一个4长度的概率向量(其条目合计为1),表示该点属于每个聚类的概率。Scatterplot其中每个点颜色是K个颜色的不同混合物

我的想法是为每个聚类指定一种颜色,然后制作一个散点图,其中每个点根据其概率向量作为所有颜色的混合物着色。如果K=3它的颜色可能是RGB,因此我可以使用像ax.scatter(x1, x2, facecolors=probability_vectors)之类的东西,就像它在this question中所说的那样。我使用该解决方案在图像中绘制了具有K=2(将所有矢量中的蓝色列固定为0)的绘图。我仍然可以将它用于K=3,但对于K=4我需要不同的东西。任何建议? 2D scatter plot with probabilites

编辑:

使用Tomáš Šíma回答,如果我用这个代码(5群):

import colorsys 
from matplotlib import pyplot as plt 
import numpy as np 

N = 5 
HSV = [(float(x)/N, 1, 1) for x in range(1,N+1)] 
RGB = map(lambda x: colorsys.hsv_to_rgb(*x), HSV) 

print HSV 
plt.scatter(range(N),np.repeat(0.5,N),c=RGB,s=200) 

我得到这样的输出:

[(0.2, 1, 1), (0.4, 1, 1), (0.6, 1, 1), (0.8, 1, 1), (1.0, 1, 1)] enter image description here

现在我的问题是,如果我有一个概率向量为[0.5, 0.0, 0.0, 0.0, 0.5]的点,即黄色群集的一半和红色的一半,它的颜色应该是橙色。但是,如果我做0.5*0.2 + 0.5*1.0我得到0.6这是蓝色的。我应该如何计算平均值以获得橙色而不是蓝色?

编辑2:

明白了,我只需要平均每个集群质心(而不是HUE)

的RGB版本:d enter image description here

+0

你是对混合的颜色,所以我更新了答案。 –

回答

1

您正在寻找HSB色彩空间。

颜色在HSB由3个值:

  • H = HUE - 实际颜色
  • S =饱和 - 多少颜色是有(少,越 颜色看起来像灰度)
  • B =亮度

可以轻松地生成从该空间N个最截然不同的颜色,然后转换为RGB

import colorsys 
N = 5 
HSV = [(x*1.0/N, 0.5, 0.5) for x in range(N)] 
RGB = map(lambda x: colorsys.hsv_to_rgb(*x), HSV) 

对于混合用于绘制点的HSB颜色,可以对权重等于概率矢量的相应RGB颜色进行加权平均。

+0

好,所以我有RGB格式的每个点(伟大)的颜色,我可以作为'plt.plot()'的'color'参数传递如果要逐点绘制散点图(迭代在数据集和计算的颜色矩阵上)。但是我怎样才能用'plt.scatter()'方法使用你的解决方案? – hipoglucido

+0

好吧,我只需要通过RGB矩阵作为'c'参数'plt.scatter()' – hipoglucido

1

您可以使用matplotlib颜色文档的Colormap section中提到的RGBA方案。 A代表阿尔法。还请阅读ScalarMappable section

从问题引用答案修改:

import matplotlib.pyplot as plt 
import numpy as np 

x, y = np.random.random((2, 10)) 
rgba = np.random.random((10, 4)) 

fig, ax = plt.subplots() 
ax.scatter(x, y, s=200, facecolors=rgba) 
plt.show() 
+0

尼斯。但是,您的解决方案不会针对'K> 4'进行扩展,对吧? – hipoglucido

+0

不,这只适用于最多4个暗淡。 –