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

