如何用Seaborn displot实现叠加KDE图(替代已弃用的distplot)
用Seaborn displot实现两列数据的KDE叠加图(替代已弃用的distplot)
问题背景
原先使用distplot可以直接叠加两列数据的KDE曲线,但改用displot后每次调用都会生成独立的图,需要调整代码实现叠加效果。
解决方案
方法1:转换为长格式数据(Seaborn推荐用法)
displot作为Figure级函数,更适配长格式数据。先把宽格式的DataFrame转成长格式,再通过hue参数区分不同数据列:
import pandas as pd import numpy as np import seaborn as sns # 生成示例数据 df1 = pd.DataFrame({ 'num1': np.random.normal(loc=0.0, scale=1.0, size=100), 'num2': np.random.normal(loc=0.0, scale=1.0, size=100) }) # 将宽格式转为长格式 df_long = df1.melt(var_name='数据列', value_name='数值') # 绘制叠加KDE图 sns.displot( data=df_long, x='数值', hue='数据列', kind='kde', palette=['orange', 'blue'] )
方法2:使用Axes级函数kdeplot叠加绘制
如果想保留宽格式数据,可以直接用Axes级的kdeplot,在同一个Matplotlib画布上多次调用实现叠加:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt df1 = pd.DataFrame({ 'num1': np.random.normal(loc=0.0, scale=1.0, size=100), 'num2': np.random.normal(loc=0.0, scale=1.0, size=100) }) # 创建画布 plt.figure() # 叠加绘制两条KDE曲线 sns.kdeplot(data=df1['num1'], color='orange', label='num1') sns.kdeplot(data=df1['num2'], color='blue', label='num2') # 添加图例 plt.legend() plt.show()
说明
- 方法1是Seaborn官方推荐的方式,长格式数据能让displot自动处理图例、配色等细节,后续新增数据列时扩展性更强。
- 方法2更贴近原
distplot的使用逻辑,直接在同一轴上叠加绘制,灵活性更高。
内容的提问来源于stack exchange,提问作者jmich738
相关产品推荐
相关产品推荐

