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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:53:22