如何用Python的matplotlib.hist()绘制自定义区间的概率直方图?
解决matplotlib直方图绘制问题
我来帮你搞定这个直方图的问题!你现在遇到的问题主要是几个细节没处理到位,我一步步给你拆解修正:
核心问题梳理
- 你的
list_age里都是字符串类型的年龄,matplotlib没法直接用字符串计算区间频数 - 没有指定你想要的自定义X轴区间(bins),默认的区间划分不符合你的需求
- 默认直方图绘制的是频数,不是你要的概率
修正后的完整代码
import matplotlib.pyplot as plt # 补全你的年龄列表(假设省略部分都是合法的年龄字符串) list_age = ['26','28','26','36','38','31','22','31','25','30','37','27','27','29','27','21','27','38','31','41','28','31','28','33','26','39','37','24','31','34','39','33','22', '30','24','29'] # 1. 把字符串年龄转成整数,让matplotlib能正确处理 age_numbers = [int(age) for age in list_age] # 2. 定义你想要的X轴区间 custom_bins = [0, 20, 25, 30, 35, 40, 45, 50, 55] # 3. 绘制概率直方图:用weights参数让Y轴显示每个区间的概率占比 weights = [1/len(age_numbers)] * len(age_numbers) plt.hist(age_numbers, bins=custom_bins, weights=weights, edgecolor='black') # 设置图表标签和标题 plt.xlabel('年龄') plt.ylabel('概率') plt.title('年龄分布概率直方图') # 把X轴刻度设置为你指定的区间值 plt.xticks(custom_bins) plt.show()
关键步骤解释
- 数据类型转换:把字符串转成整数是基础操作,不然matplotlib无法统计每个区间内的年龄数量
- 自定义区间:
custom_bins直接传入你要求的区间列表,hist函数会严格按照这个划分来分组数据 - 概率设置:通过
weights给每个数据点赋予1/总数据量的权重,这样每个区间的柱子高度就是该区间的概率占比(所有区间的概率和为1)。如果你想显示概率密度(区间高度×区间宽度=概率),可以把weights参数换成density=True,根据你的实际需求选择即可
另外,要是某个区间(比如0-20岁)没有数据,对应的柱子高度会是0,这是正常现象,因为你的数据里没有这个区间的年龄。
内容的提问来源于stack exchange,提问作者Shaju
相关产品推荐
相关产品推荐

