You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Seaborn displot生成的3个分布图横向排列成一行

解决Seaborn displot横向排列三个分布图的问题

问题原因

displot是Seaborn的**figure-level(画布级)函数,每次调用都会自动创建新的Figure对象,因此你之前用plt.subplots创建的坐标轴会被忽略,且三次调用displot会生成三个独立画布,最终纵向排列。而旧版的distplot是axes-level(坐标轴级)**函数,可以通过ax参数指定绘制到已有的坐标轴上,所以之前的方法有效,但distplot已被官方弃用,不建议继续使用。

解决方案

以下提供两种可行的实现方式:

方法1:转换数据格式,利用displot的col参数(推荐)

将数据从宽格式转换为长格式,通过col参数指定分组列,自动生成横向排列的子图:

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

# 将宽格式数据转为长格式
df_long = pd.melt(df, value_vars=['col1', 'col2', 'col3'], 
                  var_name='列名', value_name='数值')

# 绘制一行三列的分布图
sns.displot(data=df_long, x='数值', col='列名', 
            kde=True, height=3, aspect=1.5)
plt.tight_layout()
plt.show()

方法2:使用axes级函数histplot配合subplots

改用Seaborn推荐的axes级函数histplot(distplot的替代),直接指定绘制到plt.subplots创建的坐标轴上:

import seaborn as sns
import matplotlib.pyplot as plt

# 创建一行三列的子图布局
f, axes = plt.subplots(ncols=3, figsize=(15, 6))

# 分别在每个坐标轴上绘制分布图
sns.histplot(df.col1, kde=True, ax=axes[0])
axes[0].set_title('col1')

sns.histplot(df.col2, kde=True, ax=axes[1])
axes[1].set_title('col2')

sns.histplot(df.col3, kde=True, ax=axes[2])
axes[2].set_title('col3')

plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:28:21