首页 > 解决方案 > Python散点图:相同的颜色不接触

问题描述

考虑以下散点图。

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 <= M <= 20)。我想找到一种颜色,使得散点图中没有两种相同的颜色“触摸”。触摸我的意思是“彼此相邻”或“它们之间有通畅的视线”。

我知道这是可以解决的,因为任何平面图都是四色的,并且已经在 python 中实现了图形着色(例如 networkx)。我该怎么办?

标签: pythondata-visualizationcluster-analysisgraph-coloring

解决方案


您可以生成一个矩阵,该矩阵由一个旋转的颜色列表组成,您以一种不接触的方式排列这些颜色,然后将其用作点颜色。

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)

在此处输入图像描述


推荐阅读