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

