Matplotlib 2.2.2:离散分类Y轴的刻度、范围设置及顺序自定义
解决Matplotlib 2.2.2中Y轴自定义分类范围与顺序的问题
没问题,针对你在Matplotlib 2.2.2里遇到的这两个需求——让Y轴包含数据中未出现的分类,同时自定义分类的显示顺序——我们可以通过手动指定Y轴的刻度规则来解决。默认情况下Matplotlib会按数据里类别出现的先后顺序生成Y轴,所以咱们直接干预这个逻辑就好,下面是具体的实现方案和代码示例:
核心思路
- 先定义完整的Y轴分类列表(包含你需要的所有分类,哪怕数据里没出现),并按你想要的顺序排列
- 手动设置Y轴的刻度位置和对应的分类标签,覆盖Matplotlib的默认生成逻辑
- 如果是绘制条形图这类需要定位元素的图表,要把原始的类别数据转换成自定义列表中的索引,确保元素出现在正确的Y轴位置上
示例1:散点图场景
假设你的数据是散点形式,直接绘制后再修改Y轴即可:
import matplotlib.pyplot as plt # 你的原始数据 x_values = [1.2, 3.5, 5.1, 7.8] y_categories = ["B", "A", "C", "A"] # 数据里没有"D"这个分类 # 自定义Y轴的分类顺序,包含未出现的"D" desired_y_order = ["A", "B", "C", "D"] # 绘制散点图 plt.scatter(x_values, y_categories) # 设置Y轴刻度:位置是0到3(对应4个分类),标签用我们自定义的顺序 plt.yticks(ticks=range(len(desired_y_order)), labels=desired_y_order) # 补充图表信息 plt.title("Scatter Plot with Custom Y-axis") plt.xlabel("X Data") plt.ylabel("Categories") plt.show()
运行这段代码后,Y轴会按A→B→C→D的顺序显示,哪怕数据里没有D,它也会出现在Y轴上。
示例2:水平条形图场景
如果是绘制水平条形图,需要先把原始类别转换成自定义列表的索引,确保条形对应到正确的位置:
import matplotlib.pyplot as plt # 原始数据:分类和对应数值 category_counts = {"B": 4, "A": 6, "C": 3} y_categories = list(category_counts.keys()) x_values = list(category_counts.values()) # 自定义Y轴分类顺序,包含未出现的"D" desired_y_order = ["C", "A", "B", "D"] # 将原始类别转换为自定义列表中的索引 y_indices = [desired_y_order.index(cat) for cat in y_categories] # 绘制水平条形图 plt.barh(y_indices, x_values) # 设置Y轴刻度 plt.yticks(ticks=range(len(desired_y_order)), labels=desired_y_order) # 补充图表信息 plt.title("Horizontal Bar Chart with Custom Y-axis") plt.xlabel("Count") plt.ylabel("Categories") plt.show()
这里的y_indices会把每个原始类别映射到自定义顺序的位置上,比如A会对应索引1,这样条形就会出现在Y轴A标签的位置。
关键说明
- 这种方法完全兼容Matplotlib 2.2.2版本,因为
yticks是Matplotlib一直以来的核心API,没有版本兼容性问题 - 如果需要垂直条形图,逻辑类似,只需要把
barh换成bar,并调整yticks为xticks即可(如果是X轴分类的话)
内容的提问来源于stack exchange,提问作者stklik
相关产品推荐
相关产品推荐

