You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Matplotlib子图中为直方图添加密度曲线(支持Seaborn实现)

解决方案:用Seaborn在已有Matplotlib子图中添加直方图+密度曲线

嘿,刚好踩过这个坑!你已经用plt.subplots()搭好了子图框架,那直接用seaborn.histplot()就可以完美解决——它支持指定ax参数绑定到已有的子图上,完全适配你的场景,比手动计算密度再画曲线省心太多。

完整实现代码

首先导入依赖库,再生成示例数据(你可以替换成自己的x、y数据):

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

# 生成测试数据(替换成你的真实数据)
x = np.random.normal(loc=0, scale=1, size=1000)
y = np.random.normal(loc=2, scale=1.5, size=1000)

然后是核心绘图逻辑,直接在你原有的子图上叠加直方图和密度曲线:

# 创建子图(和你原来的代码一致)
fig, axs = plt.subplots(1, 2, figsize=(12, 5))

# 给第一个子图画直方图+密度曲线
sns.histplot(
    x=x,
    kde=True,  # 开启密度曲线
    ax=axs[0],  # 指定绑定到第一个子图
    bins=20,    # 直方图箱数,可按需调整
    alpha=0.5,  # 直方图透明度,方便看曲线
    stat='density'  # 可选:让直方图y轴用密度值,和曲线对齐
)

# 给第二个子图做同样的操作
sns.histplot(
    x=y,
    kde=True,
    ax=axs[1],
    bins=20,
    alpha=0.5,
    stat='density'
)

# 美化细节
axs[0].set_title('X: Histogram + Density Curve')
axs[1].set_title('Y: Histogram + Density Curve')
plt.tight_layout()  # 自动调整子图间距
plt.show()

关键说明

  • 为什么不用displot()?因为displot()是Seaborn的图级函数,会自动创建新的画布和子图结构,确实没法直接绑定到已有的Matplotlib子图上。而histplot()轴级函数,支持通过ax参数指定绘图的目标子图,刚好匹配你的需求。
  • kde=True参数会自动计算并绘制核密度估计曲线,不需要你手动计算密度值再调用plot()
  • 如果不需要直方图和曲线的y轴对齐,可以去掉stat='density',此时直方图y轴是频数,曲线会用右侧的y轴显示密度值。

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

火山引擎 最新活动