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

如何实现Seaborn绘图中子图的列换行布局?

实现Seaborn直方图类绘图的列换行子图布局

方法一:用Seaborn figure-level函数 displot(推荐)

displot是Seaborn的figure-level统一接口,自带col_wrap参数直接实现子图换行,无需手动处理Matplotlib子图,代码简洁易维护。

步骤:

  1. 将数据集转换为长格式(Facet类绘图要求的格式)
  2. 调用displot并设置col_wrap控制每行子图数量
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 读取数据集(替换为你的本地文件路径)
df = pd.read_csv('indian_liver_patient.csv')

# 转换为长格式:保留'Dataset'作为分组列,其他列转为特征-值对
df_long = df.melt(id_vars='Dataset', var_name='feature', value_name='value')

# 绘制带换行的子图
sns.displot(
    data=df_long,
    x='value',
    hue='Dataset',
    col='feature',
    col_wrap=3,  # 每行显示3个子图,自动换行
    kind='hist',  # 指定绘制直方图,换成'kde'可绘制密度图
    kde=True,
    bins=40,
    fill=True,
    height=3,  # 单个子图的高度
    aspect=1   # 子图宽高比
)
plt.tight_layout()
plt.show()

方法二:Matplotlib子图+Seaborn axes-level函数

如果你习惯手动控制Matplotlib子图布局,可以调整代码如下,避免之前的布局错误:

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

df = pd.read_csv('indian_liver_patient.csv')

# 排除'Dataset'列,统计特征数量
feature_cols = [col for col in df.columns if col != 'Dataset']
num_features = len(feature_cols)
cols_per_row = 3
# 计算所需行数(向上取整)
rows = (num_features + cols_per_row - 1) // cols_per_row

# 创建子图网格
fig, axes = plt.subplots(rows, cols_per_row, figsize=(cols_per_row*3, rows*3))
# 将二维axes数组转为一维,方便循环
axes = axes.flatten()

# 循环绘制每个特征的直方图
for idx, col in enumerate(feature_cols):
    sns.histplot(
        df, x=col, kde=True, bins=40, hue='Dataset', fill=True,
        ax=axes[idx]
    )
    axes[idx].set_title(col)
    axes[idx].tick_params(axis='x', rotation=45)  # 旋转x轴标签避免重叠

# 隐藏多余的空白子图(当特征数不是每行数量的整数倍时)
for idx in range(num_features, len(axes)):
    axes[idx].axis('off')

plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:33:26