如何使用matplotlib指定散点颜色以对应聚类分组的年份标签
按年份聚类可视化实现方案
你需要的效果是在可视化结果中显示颜色和年份的对应关系,核心是将年份作为离散分类处理,为每个年份绑定独立的颜色和图例标签,修改后的可运行代码如下:
import matplotlib.pyplot as plt import numpy as np # 提取基础数据 years = [x[0].get_year() for x in vectors] x_pca = X_train_pca[:, 0] y_pca = X_train_pca[:, 1] poem_titles = [x[0].title for x in vectors] # 提取所有不重复的年份,生成匹配的颜色映射 unique_years = np.unique(years) # 可根据年份数量更换色卡:10个以内用tab10,20个以内用tab20 color_map = plt.get_cmap("tab10", len(unique_years)) # 按年份分组绘制散点,每个分组绑定年份标签用于生成图例 for year_idx, year_val in enumerate(unique_years): # 筛选当前年份的所有样本点 year_filter = [y == year_val for y in years] plt.scatter( x_pca[year_filter], y_pca[year_filter], color=color_map(year_idx), label=str(year_val) ) # 添加诗词标题标注 for i, txt in enumerate(poem_titles): plt.annotate(_(txt), (x_pca[i], y_pca[i])) # 配置图表样式 plt.title("Poem Clustering by year") # 图例默认显示在图内,若遮挡内容可改为放在右侧外侧: # plt.legend(bbox_to_anchor=(1.02, 1), loc="upper left", borderaxespad=0) plt.legend() plt.savefig(newpath+"Clustering_by_year"+".png", bbox_inches="tight") print("DONE!")
你想要实现的参考效果如下:
关键修改说明
- 原代码直接将年份传入
c参数会被识别为连续数值,无法生成离散的年份图例;改为按年份分组绘制散点并绑定label后,调用plt.legend()即可自动生成颜色和年份一一对应的图例 - 修复了原代码中用于标注的坐标变量
x、y未定义的问题,直接使用PCA降维后的坐标作为标注位置 - 可根据实际年份数量更换色卡,年份数量较多时建议使用
tab20等包含更多离散颜色的色卡保证区分度 - 若图例遮挡绘图内容,可调整
bbox_to_anchor参数将图例放在画布外侧,savefig的bbox_inches="tight"参数会自动适配画布大小不会截断图例
内容的提问来源于stack exchange,提问作者Zahra Hosseini
相关产品推荐
相关产品推荐

