如何绘制基于聚类隶属度的colormap散点图实现软聚类可视化
软聚类隶属度混色散点图实现方案
你需要的这类展示跨聚类隶属关系的散点图,核心逻辑是放弃硬分配单一点固定颜色的规则,用每个点在各聚类的隶属度作为权重,对预设的聚类基色做加权混合,得到每个点独有的过渡色,不需要调用预置的连续色卡,就能实现聚类边界自然过渡的效果。

具体实现流程
- 预设聚类基色:根据聚类数量选择对应数量的高区分度RGB基色,比如3聚类就选红、绿、蓝三原色,2聚类选橙、紫这类对比色即可,基色数值统一用0-1范围的RGB值。
- 逐点计算混色结果:对每个数据点,将它在所有聚类的隶属度(软聚类输出的概率/权重值,单样本所有隶属度和为1)作为权重,和对应聚类的基色做加权求和,直接得到该点的最终RGB颜色值。比如某点在红聚类隶属度0.4、蓝聚类隶属度0.6,最终颜色就是40%红+60%蓝的紫色调,直观体现它介于两个聚类之间的归属状态。
- 传入散点接口绘图:不需要使用matplotlib内置colormap,直接把所有点计算好的RGB颜色数组传给散点函数的颜色参数,搭配适当的透明度参数解决点重叠遮挡问题即可。
可直接复用的参考代码
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.mixture import GaussianMixture # 生成测试数据集 X, _ = make_blobs(n_samples=1600, centers=3, cluster_std=1.9, random_state=42) # 执行软聚类,GMM可直接输出每个样本对应各聚类的隶属度概率 gmm = GaussianMixture(n_components=3, random_state=42) gmm.fit(X) membership = gmm.predict_proba(X) # 输出维度为(样本数, 聚类数),每行隶属度和为1 # 定义3个聚类对应的RGB基色(数值范围0-1) base_colors = np.array([ [1.0, 0.25, 0.2], # 聚类0:红色 [0.2, 0.95, 0.3], # 聚类1:绿色 [0.25, 0.4, 1.0] # 聚类2:蓝色 ]) # 矩阵乘法批量计算所有样本点的混色结果,比逐点循环效率高很多 point_colors = membership @ base_colors # 绘制最终散点图 plt.figure(figsize=(8, 6), dpi=130) plt.scatter(X[:, 0], X[:, 1], c=point_colors, s=16, alpha=0.7) plt.axis('off') plt.show()
效果调优技巧
- 如果觉得聚类边界的过渡色太淡、区分度不够,可以对隶属度做幂次变换强化权重差:比如将隶属度替换为
membership ** 1.6后重新做行归一化(保证每行和为1),再计算混色。幂次越高,点的颜色越接近所属概率最高聚类的纯色,越接近硬聚类效果;幂次越低,颜色过渡越柔和。 - 点密度过高时可以把
alpha参数调到0.3~0.5,重叠区域颜色会自然加深,同时还能体现数据的密度分布。 - 需要添加图例时,直接用对应基色创建自定义色块即可,不需要从散点中提取颜色。
内容的提问来源于stack exchange,提问作者Jazim Sohail
相关产品推荐
相关产品推荐

