Python用seaborn绘制直方图及添加均值方差四分位数标注方法
问题解答
一、现有实现正确性判断
- 概率计算逻辑:你的循环使用
range(100),i的取值是0~99,如果你的业务需求中i需要从1开始计数,可调整为range(1,101),否则当前逻辑没问题。 - 统计量计算:
- 均值计算逻辑正确
- 方差当前用
statistics.variance计算的是样本方差,若你需要总体方差,可替换为statistics.pvariance(probability) - 四分位数用
np.quantile计算逻辑正确
- 绘图逻辑:当前
sns.displot可以正常输出直方图和KDE曲线,若要展示概率密度而非样本计数,可添加参数stat="density",更贴合概率分布的展示场景。
二、添加统计量到图表的实现方案
你可以通过添加垂直参考线标注均值、四分位数位置,同时在角落添加文本框展示所有统计量的数值,修改后的完整代码如下:
import seaborn as sns import numpy as np import math import statistics import matplotlib.pyplot as plt # 计算概率值 probability = [] # 如果你需要i从1开始,把range(100)改成range(1,101)即可 for i in range(100): probability.append((61/99) * math.e**(-0.5 * i) + (38/99) * math.e**(-0.25 * i)) # 计算统计量 mean = sum(probability)/float(len(probability)) variance = statistics.variance(probability) q25 = np.quantile(probability, 0.25) q50 = np.quantile(probability, 0.5) q75 = np.quantile(probability, 0.75) # 绘图 g = sns.displot(probability, bins=100, kde=True, stat="density") ax = g.ax # 获取绘图轴对象 # 添加垂直参考线 ax.axvline(mean, color='red', linestyle='-', linewidth=2, label=f'均值: {mean:.4f}') ax.axvline(q25, color='orange', linestyle='--', linewidth=2, label=f'25分位数: {q25:.4f}') ax.axvline(q50, color='green', linestyle='--', linewidth=2, label=f'50分位数(中位数): {q50:.4f}') ax.axvline(q75, color='purple', linestyle='--', linewidth=2, label=f'75分位数: {q75:.4f}') # 添加统计量文本框 text_str = '\n'.join(( f'均值 = {mean:.4f}', f'方差 = {variance:.4f}', f'25%分位数 = {q25:.4f}', f'50%分位数 = {q50:.4f}', f'75%分位数 = {q75:.4f}' )) # 在右上角添加文本框,bbox参数是设置文本框的样式 ax.text(0.95, 0.95, text_str, transform=ax.transAxes, verticalalignment='top', horizontalalignment='right', bbox=dict(boxstyle='round', facecolor='white', alpha=0.8)) # 添加图例 ax.legend() # 显示图表 plt.show()
代码说明:
- 新增了
matplotlib.pyplot的导入,用来做更灵活的图表自定义 - 垂直参考线用不同颜色区分,会自动显示在图例中
- 右上角的文本框会展示所有统计量的数值,背景设为半透明白色,不会遮挡图表内容
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

