如何用Pandas绘制降序排列的value counts水平条形图?
解决水平条形图降序排列的问题
嘿,这个问题我太懂了!刚用pandas绘图的时候也踩过这个坑——明明统计的次数是降序,画出来的水平条形图却反过来了。别着急,咱们一步步来解决:
第一步:正确统计值的出现次数
首先,统计每个值的出现次数,推荐用pandas的value_counts()方法,它默认就是按降序排列的,省了不少事:
import pandas as pd # 假设你的DataFrame是df,目标列是target_column counts = df['target_column'].value_counts()
如果你是用groupby统计的,记得手动加排序:
counts = df.groupby('target_column').size().sort_values(ascending=False)
第二步:绘制降序的水平条形图
这里分两种常见的绘图方式来说:
方法1:用pandas自带的绘图工具
pandas的plot.barh()会把Series的第一个元素放在y轴最下方,所以如果直接用默认降序的counts绘图,最大的数值会在最下面。这时候我们只需要反转y轴就能让最大的条形在顶部:
import matplotlib.pyplot as plt plt.figure(figsize=(8, 5)) # 设置图的大小 counts.plot(kind='barh', color='#4285F4') # 绘制水平条形图 plt.gca().invert_yaxis() # 关键:反转y轴顺序 # 加上标题和标签让图更清晰 plt.title('Value Counts (Descending Order)') plt.xlabel('Number of Occurrences') plt.ylabel('Values') plt.show()
当然,你也可以先把counts按升序排列,再绘图,这样就不用反转y轴了:
counts_sorted_asc = counts.sort_values(ascending=True) counts_sorted_asc.plot(kind='barh')
方法2:用Seaborn绘图
如果习惯用Seaborn,记得在barplot里指定order参数,直接用统计结果的索引顺序就行:
import seaborn as sns # 把统计结果转成DataFrame count_df = counts.reset_index() count_df.columns = ['value', 'count'] plt.figure(figsize=(8, 5)) # 指定order为count_df['value'],保证按降序排列 sns.barplot(x='count', y='value', data=count_df, order=count_df['value'], palette='Blues_r') plt.title('Value Counts (Descending Order)') plt.xlabel('Number of Occurrences') plt.ylabel('Values') plt.show()
为什么之前没排序成功?
大概率是这两个原因:
- 统计次数的时候没做排序,比如用了
groupby但没加.sort_values() - 水平条形图的y轴默认顺序和我们直觉相反,没做反转或调整
内容的提问来源于stack exchange,提问作者jxn
相关产品推荐
相关产品推荐

