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

2024-04-27 09:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的想法是给每个簇指定一个颜色,然后绘制一个散点图,其中每个点根据其概率向量作为所有颜色的混合着色。如果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:

明白了,我只需要平均每个星团质心的RGB版本(而不是色调)

:天 enter image description here


Tags: import编辑颜色as绘制plt聚类rgb
2条回答

您正在寻找HSB颜色空间。

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

  • H=色调-实际颜色
  • 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颜色进行加权平均,权重等于概率向量。

您可以使用matplotlib colors文档的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()

相关问题 更多 >