如何为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
相关产品推荐
相关产品推荐

