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

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没有内置的一键将这四个统计值全标注在直方图上的现成函数,但可以通过几行代码自定义实现,全程不需要额外安装第三方库,完全适配你现有的代码逻辑:

  1. 逻辑说明:均值、中位数是和x轴(积分值)同量级的数值,可以用垂直参考线直接标在对应位置;标准差、方差是衡量数据离散程度的统计量,尤其是方差是离均差平方的平均值,量级远大于积分本身的取值范围(比如本数据集的积分方差约276,积分最大值才87),无法在x轴上定位,所以适合放在图的空白文本框中展示,避免坐标错位。
  2. 可直接运行的完整代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 08:27:01