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

如何在Seaborn v0.11.0的histplot中添加均值和中位数线?

刚好前段时间在Seaborn v0.11.0里用histplot的时候也遇到了这个需求,分享几个亲测好用的方法,不用复杂的 hack 就能轻松加上均值和中位数线:

方法1:手动计算+Matplotlib axvline(最通用)

这是最直接的思路:先画出直方图,然后计算数据的均值/中位数,再用Matplotlib的axvline函数把线加上,还能自定义样式区分两者。

示例代码:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# 生成测试数据(你可以替换成自己的数据集)
data = np.random.normal(loc=50, scale=10, size=1000)

# 绘制直方图,同时获取轴对象
ax = sns.histplot(data=data, kde=True, color='lightblue')

# 计算均值和中位数
mean_val = np.mean(data)
median_val = np.median(data)

# 添加均值线:红色虚线,带标注
ax.axvline(mean_val, color='red', linestyle='--', linewidth=2, label=f'Mean: {mean_val:.2f}')
# 添加中位数线:蓝色实线,带标注
ax.axvline(median_val, color='darkblue', linestyle='-', linewidth=2, label=f'Median: {median_val:.2f}')

# 显示图例
ax.legend()
plt.show()

方法2:分组直方图的批量添加

如果你的数据是分组的(比如用hue参数区分组别),可以循环每个分组计算统计量,再对应添加线条,还能匹配分组的颜色:

示例代码:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 生成分组测试数据
df = pd.DataFrame({
    'value': np.concatenate([np.random.normal(40, 8, 500), np.random.normal(60, 12, 500)]),
    'group': ['Group A']*500 + ['Group B']*500
})

# 绘制分组直方图
ax = sns.histplot(data=df, x='value', hue='group', kde=True, multiple='layer')

# 获取分组的颜色(和直方图的颜色对应)
handles, labels = ax.get_legend_handles_labels()
group_colors = [handle.get_edgecolor() for handle in handles]

# 遍历每个分组添加线条
for idx, group in enumerate(df['group'].unique()):
    group_data = df[df['group'] == group]['value']
    mean_val = group_data.mean()
    median_val = group_data.median()
    
    # 添加均值线
    ax.axvline(mean_val, color=group_colors[idx], linestyle='--', linewidth=1.5, 
               label=f'{group} Mean: {mean_val:.2f}')
    # 添加中位数线
    ax.axvline(median_val, color=group_colors[idx], linestyle=':', linewidth=1.5, 
               label=f'{group} Median: {median_val:.2f}')

# 更新图例
ax.legend(loc='upper right')
plt.show()

补充说明

其实Seaborn的histplot本身没做这个功能,是因为它的设计理念就是和Matplotlib深度结合,把这类个性化的自定义操作交给Matplotlib的原生函数来实现,这样反而更灵活——你可以随便调整线条的颜色、样式、粗细,甚至添加标注文本。

内容的提问来源于stack exchange,提问作者user6400946

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:38:12