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
相关产品推荐
相关产品推荐

