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

Python 散点图,其中每个点颜色是K颜色的不同混合,python,matplotlib,machine-learning,colors,scatter-plot,Python,Matplotlib,Machine Learning,Colors,Scatter Plot,我有二维数据,我想聚类成K个簇。让我们假设K=4。运行聚类算法后,每个点都有一个4长度的概率向量(其条目相加为1),表示该点属于每个聚类的概率 我的想法是为每个簇指定一种颜色,然后绘制散点图,其中每个点根据其概率向量作为所有颜色的混合着色。如果K=3它的颜色可以是RGB,因此我可以使用类似于ax.scatter(x1,x2,facecolors=probability_vectors)的东西,就像它在中所说的那样。我使用该解决方案在具有K=2的图像中绘制了图(将所有向量中的蓝色列固定为0)。对于

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

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

编辑: 使用answer,如果我使用此代码(用于5个集群):

我得到这个输出:

[(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版本(而不是色调)

:D
您正在寻找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颜色文档中提到的RGBA方案。A代表阿尔法。也请阅读

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

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

好的,这样我就有了每个点的RGB格式的颜色(很好),我可以将其作为
plt.plot()
color
参数传递,如果我们要逐点手动绘制散布(迭代数据集和计算的颜色矩阵)。但是我如何使用你的解决方案来使用
plt.scatter()
方法呢?好的,我只需要将RGB矩阵作为
plt.scatter()的
c
参数来传递。但是,您的解决方案不适用于
K>4
,对吗?关于混合颜色,您是对的,所以我更新了答案。
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()