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

如何在Python中基于Pandas DataFrame绘制按值排序的直方图?

如何绘制按值排序的直方图(文本/可视化版)

嘿,我明白你想要的是类似示例里的文本星号直方图,而pandas.DataFrame.hist其实是用来生成matplotlib的可视化分布直方图的,和你需求匹配度不高。下面分别给你两种解决方案:

方案一:生成你要的文本式星号直方图

先还原你的DataFrame:

import pandas as pd

# 构造你的数据
df = pd.DataFrame({
    'category': ['Art', 'Comics', 'Crafts', 'Dance'],
    'number': [10000, 235, 293, 824]
}).set_index('category')

首先按数值降序排序(对应你示例里的Art/Dance/Crafts/Comics顺序),然后做数值缩放——因为10000直接转星号会有一万个,显然不合理,我们可以让最大的类别对应固定数量的星号(比如20个),这样比例协调:

# 按number降序排序
sorted_df = df.sort_values('number', ascending=False)

# 设定缩放比例:让最大值对应20个星号,你可以调整这个数字改变星条长度
max_value = sorted_df['number'].max()
star_scale = 20 / max_value

# 生成每个类别的星号字符串
sorted_df['histogram_stars'] = sorted_df['number'].apply(lambda x: '*' * round(x * star_scale))

最后按你要的格式打印:

# 打印星号行
for stars in sorted_df['histogram_stars']:
    print(stars)

# 打印分隔线和标签
print('-------------')
print(f"x labels = {'/ '.join(sorted_df.index)}")

运行后输出会和你的示例类似:

********************
********
***
**
------------- 
x labels = Art/ Dance/ Crafts/ Comics

方案二:绘制排序后的可视化直方图

如果你其实想要的是可视化图表,那可以先排序DataFrame,再用条形图(因为你的数据是类别对应数值,条形图比直方图更合适):

import matplotlib.pyplot as plt

# 按number降序排序
sorted_df = df.sort_values('number', ascending=False)

# 绘制条形图,实现排序后的"直方图"效果
sorted_df['number'].plot(kind='bar', title='Sorted Category Counts')
plt.xlabel('Category')
plt.ylabel('Number')
plt.show()

这里补充下:pandas.DataFrame.hist的作用是统计单个数值列的分布(比如把数值分成多个区间,统计每个区间的频数),并不适合你这种类别-数值对应的展示需求,用条形图才是正确的选择。

内容的提问来源于stack exchange,提问作者sealpuppy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:53:59