python - 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)。我该怎么办?
解决方案
您可以生成一个矩阵,该矩阵由一个旋转的颜色列表组成,您以一种不接触的方式排列这些颜色,然后将其用作点颜色。
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)
推荐阅读
- amazon-web-services - 如何根据条件在 S3 上启用/禁用加密
- node.js - 如何删除 gatsby-starter-portfolio-cara 文件?
- javascript - 在角度 html 模板中显示来自ngrx 存储的单个对象
- javascript - 如何在js中更漂亮地将对象数组保持在一行
- amazon-dynamodb - 在 DynamoDB 中查询最近 7 天的数据
- javascript - 扩展运算符在 javascript 中无法正常工作
- apache-spark - 如果我运行此代码,为什么 spark 会返回“任务不可序列化”?
- kubernetes - Kubernetes - 同一命名空间中的两个不同 Pod 之间的 HTTP 通信
- android-studio-4.1 - Android Studio 中的“创建新项目”消失了
- android - 如何使用 GPS 在我的 android 应用程序中获取当前位置..?