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

如何在seaborn histplot中单独标注KDE曲线并设置图例样式

解决Seaborn直方图中KDE曲线单独标注图例的问题

问题核心:使用sns.histplot时,直接设置label会让整个直方图(包括柱子和KDE曲线)共享一个图例项,导致图例显示异常。需要单独为KDE曲线添加标注,让它在图例中显示为绿色实线,与高斯拟合的红色虚线样式对应。

修改思路

  • 拆分绘制步骤:先单独绘制直方图(关闭内置KDE),再用sns.kdeplot单独绘制KDE曲线,此时可以给KDE曲线独立设置label和样式。
  • 保留原有的高斯拟合曲线绘制逻辑,确保图例区分清晰。

修改后的完整代码

import numpy as np
import matplotlib.pylab as plt
import seaborn as sns
import scipy.stats as stats
from scipy.stats import norm

# 生成数据
np.random.seed(63123) 
data = np.random.normal(loc=600, scale=30, size=20)

# 直方图参数计算
min_val = data.min()
max_val = data.max()
val_width = max_val - min_val
n_bins = 7
bin_width = val_width/n_bins

list_xticks_raw = np.arange(min_val - bin_width/2, max_val + bin_width/2, bin_width).tolist()
list_xticks_round = [round(x) for x in list_xticks_raw]

# 绘制直方图与拟合曲线
fig = plt.figure(figsize=(4,4))

# 1. 单独绘制直方图,关闭内置KDE
sns.histplot(
    x=data, 
    bins=n_bins, 
    binrange=(min_val, max_val), 
    discrete=False, 
    shrink=1.0,
    stat="density", 
    element="bars", 
    color="green", 
    kde=False  # 关闭内置KDE,后续单独绘制
)

# 2. 单独绘制KDE曲线,设置独立label和样式
sns.kdeplot(
    x=data, 
    color="green", 
    linestyle="-", 
    label="KDE fit"
)

plt.xlim(min_val - bin_width/2, max_val + bin_width/2)
plt.xticks(list_xticks_round)

# 3. 绘制高斯拟合曲线,保留原有逻辑
mu, sigma = stats.norm.fit(data)
sorted_data = np.sort(data)
gaussian_fit = stats.norm.pdf(sorted_data, mu, sigma)
plt.plot(sorted_data, gaussian_fit, linestyle="--", color="red", label="Gaussian fit")

plt.legend()
plt.show()

关键改动说明

  • 移除了sns.histplot中的label参数,并将kde=True改为kde=False,避免直方图与KDE曲线绑定同一图例项。
  • 新增sns.kdeplot单独绘制KDE曲线,这里可以自由设置曲线的颜色、线型和图例标签,确保图例中只显示KDE曲线的样式(绿色实线)。
  • 高斯拟合曲线的绘制逻辑保持不变,图例中会显示红色虚线的"Gaussian fit"条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:52:35