问题描述
考虑以下散点图。
import seaborn as sns
from sklearn.datasets import load_iris
k = load_iris().data[:,:2]
_ = sns.scatterplot(x=k[:,0],y=k[:,1])
假设我在这个数据集上运行了一个聚类算法,它只有两个特征/维度 x 和 y。聚类算法为散点图中的每个点生成一个聚类 id。集群 ID 在 [1..N] 中。我想对每个点进行不同的着色(根据其 id 使用颜色),但是,由于 N 非常大(N > 50),我用完了视觉上可区分的颜色。
比如说,我只获得了 M 种视觉上可区分的颜色(4
我知道这是可以解决的,因为任何平面图都是四种可着色的,并且已经在 python 中实现了图着色(例如 networkx)。我该怎么办?
解决方法
您可以生成一个矩阵,其中包含一个旋转的颜色列表,您将这些颜色排列在一起,使它们都不接触,然后将其用作点颜色。
import seaborn as sns
from sklearn.datasets import load_iris
from collections import deque
sns.set(rc={'figure.figsize':(16,9)})
k = load_iris().data[:,:2]
# Create a 100*100 matrix with no adjacent values
m = []
l = deque(['r','g','b','y']*25)
for x in range(100):
m.append(list(l))
l.rotate(2)
# Create color map by using values as coordinates to select
# from color matrix
colors = []
for e in k:
p = [(int(str(x).replace('.',''))) for x in e]
colors.append(m[p[0]][p[1]])
# Plot using colors from color map
_ = sns.scatterplot(x=k[:,0],y=k[:,1],c=colors,s=250)