如何实现Seaborn绘图中子图的列换行布局?
实现Seaborn直方图类绘图的列换行子图布局
方法一:用Seaborn figure-level函数 displot(推荐)
displot是Seaborn的figure-level统一接口,自带col_wrap参数直接实现子图换行,无需手动处理Matplotlib子图,代码简洁易维护。
步骤:
- 将数据集转换为长格式(Facet类绘图要求的格式)
- 调用
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
相关产品推荐
相关产品推荐

