You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为40个聚类的Matplotlib散点图分配40种不同颜色?

解决40个聚类的散点图颜色重复问题

matplotlib默认的颜色循环仅包含约20种颜色,所以当聚类数量超过20时会出现颜色重复。以下是两种简单有效的解决方法:

方法一:利用matplotlib颜色映射生成足够颜色

通过指定颜色映射(colormap)并设置颜色数量为聚类总数,即可生成对应数量的唯一颜色:

import matplotlib.pyplot as plt
import numpy as np

# 获取唯一的聚类标签,避免重复绘制
unique_labels = np.unique(labels)
# 从颜色映射中生成对应数量的颜色,viridis或tab20c都适用
cmap = plt.get_cmap('viridis', len(unique_labels))

plt.figure(figsize=(14,10))
for idx, cluster_id in enumerate(unique_labels):
    plt.scatter(df.iloc[cluster == cluster_id, 0],
                df.iloc[cluster == cluster_id, 1],
                label=cluster_id,
                alpha=0.8,
                color=cmap(idx))
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), ncol=2)
plt.show()

方法二:使用Seaborn生成高区分度调色板

Seaborn的husl调色板可以生成任意数量、视觉区分度高的均匀颜色,非常适合多聚类场景:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

unique_labels = np.unique(labels)
# 生成与聚类数匹配的颜色列表
colors = sns.color_palette("husl", len(unique_labels))

plt.figure(figsize=(14,10))
for idx, cluster_id in enumerate(unique_labels):
    plt.scatter(df.iloc[cluster == cluster_id, 0],
                df.iloc[cluster == cluster_id, 1],
                label=cluster_id,
                alpha=0.8,
                color=colors[idx])
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), ncol=2)
plt.show()

注意事项

  • 优先使用np.unique(labels)获取唯一聚类标签,避免原代码中循环labels可能导致的重复绘制问题。
  • 如果需要更个性化的颜色,可以自定义十六进制颜色列表,替换上述代码中的cmap(idx)或colors[idx]即可。

内容的提问来源于stack exchange,提问作者Mina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:41:19