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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:12:01