Matplotlib柱状图为何自动按X轴排序?如何按Y值排序?
问题分析与解决
你的代码有两个关键错误,导致柱状图无法按Y值正确排序显示:
- 柱状图x轴位置错误:你用
df.index作为plt.bar的x轴参数,但排序后的DataFrame保留了原始数据的索引(比如排序后第一条数据的索引是1,对应原数组中id=7的位置),这会让柱子的位置分散在原索引的位置上,而非按排序后的顺序连续排列。 - x轴标签设置错误:
plt.xticks的第二个参数你传了df["values"],这会把数值当成x轴标签,而你实际需要显示的是对应的ids。
修正后的代码方案
方案一:使用Matplotlib原生方法
手动设置连续的x轴位置,并绑定正确的ids标签:
import pandas as pd import matplotlib.pyplot as plt ids = [1,7,5] values = [3.0, 9000.0, 2.7] df = pd.DataFrame( { "ids": ids, "values" : values } ) # 按values降序排序 df_sorted = df.sort_values("values", ascending=False) # 用连续的整数作为x轴位置 x_pos = range(len(df_sorted)) plt.bar(x_pos, df_sorted["values"], color='skyblue', edgecolor='black') # 设置x轴刻度位置和对应的ids标签 plt.xticks(x_pos, df_sorted["ids"]) # 其他美化设置 plt.title("按数值排序的柱状图") plt.ylabel("数值") plt.xlabel("ID") plt.show()
方案二:使用Pandas内置绘图(更简洁)
Pandas的plot.bar会自动处理排序后的DataFrame索引,直接生成正确顺序的柱状图:
import pandas as pd import matplotlib.pyplot as plt ids = [1,7,5] values = [3.0, 9000.0, 2.7] df = pd.DataFrame( { "ids": ids, "values" : values } ) # 按values降序排序后直接绘图,x轴用ids df_sorted = df.sort_values("values", ascending=False) df_sorted.plot.bar(x="ids", y="values", color='skyblue', edgecolor='black') plt.title("按数值排序的柱状图") plt.ylabel("数值") plt.xlabel("ID") plt.show()
这两种方案都能实现你要的效果:数值最大的id7作为第一个柱子,数值最小的id5作为最后一个柱子,同时x轴显示对应的ID标识。
内容的提问来源于stack exchange,提问作者actopozipc
相关产品推荐
相关产品推荐

