Python中如何绘制含mean、SD、median、variance的单列统计直方图
针对单列标注多统计值的直方图实现
初始代码
import pandas as pd import matplotlib.pyplot as plt allData= None allData = pd.read_csv("football.csv") print("mean is:",allData['Points'].mean()) print("median is:",allData['Points'].median()) print("variance is:",allData['Points'].var()) print("SD is:",allData['Points'].std())
你可以通过allData.plot.bar()绘制全数据集的柱状图,运行后会展示每个球队对应所有数值列的对比柱形。
原始疑问
是否存在可行的方法或内置函数,可以针对某一列(示例中为Points列)绘制包含mean(均值)、SD(标准差)、median(中位数)、variance(方差)的统计直方图?
所用数据集(football.csv)
Team,Games,Wins,Losses,Draws,Goals,Goals Allowed,Points Arsenal,38,26,9,3,79,36,87 Liverpool,38,24,8,6,67,30,80 Manchester United,38,24,5,9,87,45,77 Newcastle,38,21,8,9,74,52,71 Leeds,38,18,12,8,53,37,66 Chelsea,38,17,13,8,66,38,64 West_Ham,38,15,8,15,48,57,53 Aston_Villa,38,12,14,12,46,47,50 Tottenham,38,14,8,16,49,53,50 Blackburn,38,12,10,16,55,51,46 Southampton,38,12,9,17,46,54,45 Middlesbrough,38,12,9,17,35,47,45 Fulham,38,10,14,14,36,44,44 Charlton,38,10,14,14,38,49,44 Everton,38,11,10,17,45,57,43 Bolton,38,9,13,16,44,62,40 Sunderland,38,10,10,18,29,51,40 Ipswich,38,9,9,20,41,64,36 Derby,38,8,6,24,33,63,30 Leicester,38,5,13,20,30,64,28
实现方案
pandas和matplotlib没有内置的一键将这四个统计值全标注在直方图上的现成函数,但可以通过几行代码自定义实现,全程不需要额外安装第三方库,完全适配你现有的代码逻辑:
- 逻辑说明:均值、中位数是和x轴(积分值)同量级的数值,可以用垂直参考线直接标在对应位置;标准差、方差是衡量数据离散程度的统计量,尤其是方差是离均差平方的平均值,量级远大于积分本身的取值范围(比如本数据集的积分方差约276,积分最大值才87),无法在x轴上定位,所以适合放在图的空白文本框中展示,避免坐标错位。
- 可直接运行的完整代码:
import pandas as pd import matplotlib.pyplot as plt allData = pd.read_csv("football.csv") points_data = allData['Points'] # 计算四个核心统计值 points_mean = points_data.mean() points_median = points_data.median() points_var = points_data.var() points_std = points_data.std() # 绘制基础直方图 fig, ax = plt.subplots(figsize=(8, 5)) points_data.plot.hist( bins=8, edgecolor="#333333", alpha=0.65, ax=ax ) # 绘制均值、中位数的垂直参考线 ax.axvline(points_mean, color="#dc143c", linestyle="--", linewidth=2, label=f'均值: {points_mean:.1f}') ax.axvline(points_median, color="#000080", linestyle="-.", linewidth=2, label=f'中位数: {points_median:.1f}') # 在图的右上角放置标准差、方差的文本信息,不遮挡柱形 stat_text = f'标准差(SD): {points_std:.1f}\n方差(Variance): {points_var:.1f}' ax.text( 0.95, 0.95, stat_text, transform=ax.transAxes, bbox=dict(boxstyle="round", facecolor="white", alpha=0.8), ha="right", va="top" ) # 调整图表样式 ax.set_xlabel("球队积分(Points)") ax.set_ylabel("同区间积分的球队数量") ax.set_title("球队积分分布及核心统计指标") ax.legend() plt.tight_layout() plt.show()
代码注意点:
- 使用轴相对坐标(
transform=ax.transAxes)放置文本框,不管x轴的取值范围怎么调整,文本都会固定在右上角的空白区域,不会被柱形遮挡。 - 分箱数
bins=8是适配当前20条样本量的设置,可以根据自己的样本规模调整,避免分箱过细导致柱形过碎,或者分箱过粗掩盖分布特征。 - 参考线的颜色、线型可以根据使用场景调整,核心是通过不同的视觉元素把统计值和原始柱形区分开。
内容的提问来源于stack exchange,提问作者Muath
相关产品推荐
相关产品推荐

