如何在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




