散点图,其中每个点颜色是K种颜色的不同混合

时间:2016-12-24 15:56:38

标签: python matplotlib machine-learning colors scatter-plot

我有2D数据,我想要聚集到K群集。让我们假设K=4。运行聚类算法后,每个点都有一个4长度概率向量(其条目加起来为1),表示该点属于每个聚类的概率。

我的想法是为每个聚类分配颜色,然后制作散点图,其中每个点根据其概率向量着色为所有颜色的混合。如果K=3它的颜色可能是RGB,那么我可以像this question 中所说的那样使用像ax.scatter(x1, x2, facecolors=probability_vectors)这样的东西。我使用该解决方案在图像中绘制了具有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:

知道了,我只需要平均每个群集质心的RGB版本(而不是HUE)

:d enter image description here

2 个答案:

答案 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颜色进行重量平均,其权重等于概率向量。

答案 1 :(得分:1)

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

根据问题中引用的答案进行修改:

db