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

Matplotlib如何绘制带自定义类别标签的有序分类散点图

有序分类轴散点图实现方案

核心思路是利用pandas有序分类类型固定排序规则,通过自定义matplotlib刻度替换标签,同时锁定刻度范围避免无意义的中间值出现。

实现步骤

  • 第一步:提前定义严格符合大小规则的分类序列,将DataFrame中参与绘图的两列转换为pandas有序分类类型,从根源解决排序错乱问题
  • 第二步:提取分类列的底层整数编码作为绘图的实际坐标值,保证散点位置和对角线计算的准确性
  • 第三步:将坐标轴的整数刻度位置替换为对应的分类文本标签,锁定坐标轴范围,避免出现无对应分类的半值刻度

完整可运行代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# --------------------------
# 1. 配置分类规则(可自行替换为你的分类序列)
# 严格按照从小到大的顺序排列分类,例如a < b < c < d 就写为["a", "b", "c", "d"]
cat_order = ["CCC+", "B", "A", "A+"]
# --------------------------

# 2. 将绘图用的两列转换为有序分类类型
df3["LCST"] = pd.Categorical(df3["LCST"], categories=cat_order, ordered=True)
df3["LCST.1"] = pd.Categorical(df3["LCST.1"], categories=cat_order, ordered=True)

# 3. 提取分类对应的整数编码作为绘图坐标
x_data = df3["LCST"].cat.codes
y_data = df3["LCST.1"].cat.codes

# 4. 绘图
fig, ax = plt.subplots()
ax.scatter(x_data, y_data)

# 计算坐标轴范围和参考对角线
n_category = len(cat_order)
axis_lims = [-0.5, n_category - 0.5] # 边缘留0.5单位边距,避免点贴在坐标轴边框上
ax.plot(axis_lims, axis_lims, 'k-', alpha=0.75, zorder=0)

# 替换坐标轴刻度为分类标签,强制只显示整数位置的分类刻度
ax.set_xticks(ticks=np.arange(n_category), labels=cat_order)
ax.set_yticks(ticks=np.arange(n_category), labels=cat_order)

# 保留原有图表样式配置
ax.set_aspect('equal')
ax.set_xlim(axis_lims)
ax.set_ylim(axis_lims)
ax.set_xlabel('Actual', fontsize=18)
ax.set_ylabel('Estimated', fontsize=18)

plt.show()

实现效果说明

  • 分类顺序完全遵循自定义规则,不会出现默认字典序排序错乱的问题
  • 坐标轴直接显示分类文本标签,不会暴露内部映射的数值
  • 所有刻度都对应实际存在的分类,不会出现误导性的半值刻度
  • 对角线参考线、等比例坐标轴的配置和原有需求完全一致

内容的提问来源于stack exchange,提问作者Carl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:27:33