Seaborn distplot已废弃,如何更新代码实现多列多子图分布可视化
seaborn弃用distplot的代码适配方案
seaborn从0.11版本起正式将旧的轴级distplot标记为弃用,根据官方提示可以选择两类适配方向,改完后可完全还原原参考图中「直方图叠加核密度曲线」的绘制效果,且不会触发版本报错。
方案1:低改动兼容原代码逻辑(使用轴级histplot)
这个方案最大程度保留你原有手动控制画布、子图布局的代码结构,改动量最小,和原来的使用习惯完全匹配。
只需要把循环里调用的distplot替换为histplot,开启kde=True参数即可还原原默认效果:
def creating_distplot(size, data, features): plt.figure(figsize=size) for i in range(len(features)): plt.subplot(5, 3, i + 1) # 替换原distplot调用,kde=True表示叠加核密度曲线 sns.histplot(data=data, x=features[i], kde=True) # 原有调用逻辑无需任何修改 num_vars = ad_df.select_dtypes(exclude=['object', 'datetime64']).columns creating_distplot((16,18), ad_df, num_vars)
方案优势:
- 完全兼容你自定义的5行3列子图布局、自定义画布尺寸的控制逻辑
- 输出风格和旧版distplot默认表现高度接近
- 无版本兼容报错
如果需要让直方图的计数尺度和核密度曲线完全对齐(和旧distplot的归一化效果完全一致),可以额外加上stat="density"参数,让直方图的高度换算为密度值而非原始计数值:
sns.histplot(data=data, x=features[i], kde=True, stat="density")
方案2:使用图级displot实现自动分面(更贴合seaborn新范式)
displot是官方推荐的具备同等灵活性的图级函数,本身内置批量分面能力,不需要手动写循环和subplot逻辑,代码更简洁:
sns.displot( data=ad_df, x=num_vars, # 直接传入所有需要绘制的数值特征列 kind="hist", # 指定绘制直方图类型 kde=True, # 叠加核密度曲线 col_wrap=3, # 每行排列3个子图,匹配原3列的布局风格 height=3.5, # 单个子图高度,整体观感和原16*18画布尺寸接近 aspect=1.2 # 单个子图的宽高比 )
方案优势:
- 不需要手动维护循环、子图索引逻辑,代码量大幅减少
- 自动统一所有子图的坐标风格、对齐间距,不会出现手动建子图的偶发布局错位问题
- 调整布局时只需要修改
col_wrap参数(比如改成4就是每行4个子图)即可,不需要手动修改subplot的行列参数
常见参数差异说明:旧版
distplot默认采用密度归一化的直方图尺度,新函数默认显示原始计数的y轴刻度,如需完全复刻旧版视觉效果,可在displot调用中加上stat="density"参数。
内容的提问来源于stack exchange,提问作者Harry P
相关产品推荐
相关产品推荐

