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

Scatterplot wherein each point color is a different mixture of K colors

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

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

编辑:

使用 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)]

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

编辑 2:

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

:D

您正在寻找HSB颜色space。

HSB 中的颜色由 3 个值组成:

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

您可以轻松地从这个 space 生成 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颜色做加权平均,权重等于概率向量。

您可以使用 Colormap section of matplotlib colors documentation. The A stands for alpha. Also read the ScalarMappable section 中提到的 RGBA 方案。

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

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()