如何在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
相关产品推荐
相关产品推荐

