如何绘制标记区分原始数据集、颜色区分聚类的散点图并去除重复色条
解决聚类散点图冗余色条问题
要解决重复显示三个色条的问题,核心是让所有散点共享同一套颜色映射规则,并仅绘制一次色条,具体实现步骤如下:
关键思路
重复色条的根源是每次绘制不同原始数据集的散点时,都独立生成了颜色映射并调用了colorbar()。只需统一颜色配置,在所有散点绘制完成后仅生成一次色条即可。
示例代码实现
import matplotlib.pyplot as plt from sklearn.cluster import AgglomerativeClustering import pandas as pd # 假设已完成数据集合并与聚类,得到包含以下字段的merged_df: # - 特征列(如x、y) # - source:标识原始数据集('df_1_3'/'df_5_1'/'df_5_5') # - cluster:AgglomerativeClustering输出的聚类标签 # 1. 定义标记与颜色映射 marker_map = {'df_1_3': 'o', 'df_5_1': 's', 'df_5_5': '^'} # 不同数据集用不同标记 n_clusters = merged_df['cluster'].nunique() cmap = plt.get_cmap('viridis', n_clusters) # 聚类颜色映射 # 2. 在同一轴上绘制所有散点 fig, ax = plt.subplots(figsize=(8, 6)) # 遍历每个原始数据集,共享颜色映射范围 for source, group in merged_df.groupby('source'): scatter = ax.scatter( group['x'], group['y'], marker=marker_map[source], c=group['cluster'], cmap=cmap, vmin=merged_df['cluster'].min(), # 统一颜色最小值 vmax=merged_df['cluster'].max(), # 统一颜色最大值 label=source ) # 3. 仅绘制一次色条 cbar = plt.colorbar(scatter) cbar.set_label('聚类类别') # 4. 添加图例与标签 ax.legend(title='原始数据集') ax.set_xlabel('特征X') ax.set_ylabel('特征Y') ax.set_title('聚类结果可视化') plt.show()
核心注意事项
- 所有散点必须共享相同的颜色映射(cmap)和颜色范围(vmin/vmax),确保同一聚类标签对应相同颜色。
- 仅在所有散点绘制完成后,调用一次
plt.colorbar(),传入任意一个散点对象即可生成统一的色条。 - 避免为每个数据集单独创建子图或重复调用
colorbar(),这是产生冗余色条的常见原因。
内容的提问来源于stack exchange,提问作者HarryKane
相关产品推荐
相关产品推荐

