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

Pandas绘图时如何对坐标轴进行降序排序?

Pandas绘图时如何对坐标轴进行降序排序?

嗨,我注意到你尝试用sort_values对数据排序后绘制横向柱状图,但坐标轴的排序没达到预期效果,咱们来看看问题出在哪以及怎么解决~

你当前的代码里,虽然调用了df.sort_values(['y'], ascending=[False])对数据按y列降序排列,但直接链式调用plot时,横向柱状图(barh)默认会把DataFrame的第一行数据放在图表的最下方,所以你看到的顺序可能和你预期的相反。

这里给你两种可行的解决方案:

方案一:排序后反转y轴

先对数据排序,绘图后通过反转y轴,让最大数值对应的类别显示在最上方:

from io import BytesIO
from fpdf import FPDF
import pandas as pd
import matplotlib.pyplot as plt
import io

DATA = {
    'x': ['val_1', 'val_2', 'val_3', 'val_4', 'val_5'],
    'y': [1, 2, 3, 4, 5]
}

COLUMNS = tuple(DATA.keys())

plt.figure()
df = pd.DataFrame(DATA, columns=COLUMNS)
# 对数据按y列降序排序
sorted_df = df.sort_values(['y'], ascending=[False])
# 绘制横向柱状图
sorted_df.plot(x=COLUMNS[0], y=COLUMNS[1], kind="barh", legend=False)
# 反转y轴,调整显示顺序
plt.gca().invert_yaxis()

img_buf = BytesIO()
plt.savefig(img_buf, dpi=200)

pdf = FPDF()
pdf.add_page()
pdf.image(img_buf, w=pdf.epw)
pdf.output('output.pdf')
img_buf.close()

方案二:通过索引指定坐标轴顺序

把类别列设置为索引,排序后直接绘图,让Pandas自动使用排序后的索引作为坐标轴顺序:

from io import BytesIO
from fpdf import FPDF
import pandas as pd
import matplotlib.pyplot as plt
import io

DATA = {
    'x': ['val_1', 'val_2', 'val_3', 'val_4', 'val_5'],
    'y': [1, 2, 3, 4, 5]
}

COLUMNS = tuple(DATA.keys())

plt.figure()
df = pd.DataFrame(DATA, columns=COLUMNS)
# 将x列设为索引,再按y列降序排序
sorted_df = df.set_index('x').sort_values('y', ascending=False)
# 绘制横向柱状图,此时y轴会自动沿用排序后的索引顺序
sorted_df.plot(kind="barh", legend=False)

img_buf = BytesIO()
plt.savefig(img_buf, dpi=200)

pdf = FPDF()
pdf.add_page()
pdf.image(img_buf, w=pdf.epw)
pdf.output('output.pdf')
img_buf.close()

两种方法都能实现你想要的坐标轴降序效果,你可以根据自己的习惯选择~

备注:内容来源于stack exchange,提问作者smpa01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:18:04