散点图,其中每个点颜色是 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()
我有 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()