如何用Python绘制类别计数的频率直方图?
Python实现姓名出现次数的频率直方图
实现步骤
- 统计每个姓名的出现次数
- 统计不同出现次数对应的姓名数量(即频次的分布)
- 用Matplotlib绘制可视化图表
代码示例
from collections import Counter import matplotlib.pyplot as plt # 原始姓名数据 names = [ 'Sam', 'Alex', 'Amy', 'Amy', 'Enrique', 'Daniel', 'Daniel', 'Daniel' ] # 第一步:统计每个姓名的出现次数 name_frequencies = Counter(names) # 第二步:提取所有姓名的出现次数,再统计这些次数的分布 counts = list(name_frequencies.values()) frequency_distribution = Counter(counts) # 准备绘图数据:按出现次数排序 sorted_counts = sorted(frequency_distribution.keys()) name_counts_at_freq = [frequency_distribution[count] for count in sorted_counts] # 第三步:绘制柱状图(效果与目标直方图一致) plt.figure(figsize=(6, 4)) plt.bar(sorted_counts, name_counts_at_freq, width=0.6, color='#1f77b4') # 设置图表标签与标题 plt.xlabel('姓名出现次数') plt.ylabel('对应次数的姓名数量') plt.title('姓名出现次数的频率分布') # 确保x轴刻度为实际出现的次数 plt.xticks(sorted_counts) # 添加网格线增强可读性 plt.grid(axis='y', linestyle='--', alpha=0.6) plt.tight_layout() plt.show()
代码说明
Counter(names):快速统计每个姓名的出现次数,返回键值对格式的结果(姓名: 出现次数)。Counter(counts):对第一步得到的"出现次数"再次统计,得到每个次数对应的姓名数量,比如示例中会得到{1:3, 2:1, 3:1},代表3个姓名出现1次、1个姓名出现2次、1个姓名出现3次。- 如果偏好使用直方图形式呈现,可将绘图部分替换为以下代码:
通过设置bins区间,让每个柱子精准对应1、2、3这三个离散次数,效果和柱状图一致。plt.hist(counts, bins=[0.5, 1.5, 2.5, 3.5], align='mid', rwidth=0.8)
内容的提问来源于stack exchange,提问作者Sam Degregori
相关产品推荐
相关产品推荐

