You need to enable JavaScript to run this app. pandas数据经sort_values降序排序,绘制柱状图未保持降序的问题解决
优惠活动
大模型
产品
解决方案
定价
更多

pandas数据经sort_values降序排序,绘制柱状图未保持降序的问题解决

排序异常的核心原因

问题本质是matplotlib对字符串类型x轴值的内置处理逻辑,和pandas的排序结果没有关联:

  • 当使用plt.bar("Species","Images", data=df)的写法传入字符串列名作为x参数时,matplotlib会自动提取x列的所有分类值,强制按照字典序对分类项重排后再映射对应的y值,完全不会遵循当前DataFrame的行顺序。哪怕你已经在pandas里完成降序排序、print输出的结果符合预期,只要传入的是字符串形式的分类列,最终x轴顺序都会被matplotlib强制覆盖重排。
  • 排序后未重置的旧索引只是次要影响因素,哪怕你重置了旧索引,只要x轴还是字符串类型的分类值,排序错位的问题依然存在。
标准化修复步骤

按照以下流程操作,即可稳定实现符合预期的降序柱状图:

  1. 按目标数值列完成降序排序:
    df = df.sort_values("Images", ascending=False)
  2. 重置排序后的DataFrame索引,让行索引和排序后的行顺序一一对应,避免旧索引残留导致的位置错位:
    df = df.reset_index(drop=True)
  3. 调整柱状图绘制参数,绕开matplotlib的字符串分类自动重排逻辑:
    • 不再直接传入"Species"作为x轴参数,改用重置后的整数索引df.index作为x坐标位置
    • 将之前不合理的bar_width=1000调整为适配整数坐标间隔的常规值(推荐0.6~0.8,避免柱子重叠或过窄)
    • 手动将x轴的刻度标签设置为对应行的Species值,保证每个坐标点匹配正确的物种名称
  4. 配置坐标轴标签、标题后展示图表
修正后的核心代码示例
plt.clf()
bar_width = 0.7
# 用整数索引作为x坐标,完全遵循DataFrame的排序行序排布柱子
plt.bar(x=df.index, height=df["Images"], width=bar_width)
# 手动替换x轴刻度标签,匹配对应物种名称
plt.xticks(ticks=df.index, labels=df["Species"])
plt.xlabel("Species", size=15)
plt.ylabel("Number of Images", size=15)
plt.title("Number of images for each species")
plt.show()

你之前尝试的修复方式是完全可行的:执行df = df.reset_index(drop=True)整理行索引,再将plt.bar的x参数从"Species"替换为df.index,本质是用整数坐标自主控制x轴排布顺序,绕开matplotlib对字符串分类的强制字典序重排逻辑,因此可以正确实现降序展示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 20:36:04