[英]Scatterplot wherein each point color is a different mixture of K colors
我有要聚類為K個聚類的2D數據。 假設K=4
。 運行聚類算法后,每個點都有一個4個長度的概率矢量(其條目加起來為1),指示該點屬於每個簇的概率。
我的想法是為每個聚類分配一種顏色,然后繪制一個散點圖,其中每個點根據其概率矢量被着色為所有顏色的混合。 如果K=3
,則顏色可以是RGB,因此我可以使用ax.scatter(x1, x2, facecolors=probability_vectors)
類的東西,如本問題中所述。 我使用該解決方案在具有K=2
的圖像中進行繪圖(將所有向量中的Blue列固定為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
,它是藍色。 我應該如何計算平均值才能得到橙色而不是藍色?
知道了,我只需要平均每個群集質心的RGB版本(而不是HUE)
您正在尋找HSB色彩空間。
HSB中的顏色由3個值組成:
您可以輕松地從該空間生成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代表alpha。 另請閱讀ScalarMappable部分 。
根據問題中引用的答案進行修改:
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.