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

Python seaborn/matplotlib多幅组合图存PDF、排版及尺寸调整方法

Seaborn批量组合图导出PDF+排版+尺寸调整方案

原有代码失效原因

  • 存在基础语法问题:for循环下的绘图代码未缩进、漏导入pandas库、sns.boxplot调用括号未闭合
  • 尺寸设置不生效:创建画布后未将绘图操作绑定到对应画布的坐标轴对象,seaborn默认创建新的独立画布渲染,导致figsize配置完全不生效
  • 逐张弹出图表:循环内每次调用plt.show()会单独渲染输出当前图,没有接入统一导出逻辑

实现效果

  • 所有箱线图+蜂群图组合图统一导出到单个PDF文件,无需手动逐张保存
  • 支持自定义每行排布图表数量,可自由切换2/3幅每行的布局
  • 全局可控画布/子图尺寸,彻底解决图表挤压变形问题

完整可运行代码

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import seaborn as sns
import numpy as np
from math import ceil

# -------------------------- 可自定义配置项 --------------------------
COLS_PER_ROW = 2  # 每行排列的图表数量,改成3就是每行3幅
SUBPLOT_WIDTH = 6  # 单个子图宽度(英寸)
SUBPLOT_HEIGHT = 4 # 单个子图高度(英寸)
PDF_SAVE_PATH = "seaborn_plots.pdf" # PDF保存路径
# -------------------------------------------------------------------

# 生成测试DataFrame
np.random.seed(42)
df = pd.DataFrame(np.random.randint(0,100, size=(6,4)), columns=list('ABCD'))
Groups = ['Group1','Group1', 'Group1', 'Group2','Group2','Group2'] 
df['Groups'] = Groups
first_column = df.pop('Groups')
df.insert(0, 'Groups', first_column)
col_ids = list(df.columns)
col_ids.remove('Groups')

# 计算排版需要的总行数
total_plots = len(col_ids)
n_rows = ceil(total_plots / COLS_PER_ROW)

# 初始化总画布,直接设置总尺寸 = 单图尺寸 * 网格数
fig, axs = plt.subplots(
    nrows=n_rows,
    ncols=COLS_PER_ROW,
    figsize=(SUBPLOT_WIDTH*COLS_PER_ROW, SUBPLOT_HEIGHT*n_rows)
)
sns.set(style="darkgrid")
# 将坐标轴数组展平为一维,方便循环索引
axs = axs.flatten()

# 循环绘图
for idx, col in enumerate(col_ids):
    current_ax = axs[idx]
    # 绘图时指定ax参数,绑定到对应子图
    sns.boxplot(x='Groups', y=col, data=df, ax=current_ax)
    sns.swarmplot(x='Groups', y=col, data=df, color="grey", ax=current_ax)
    current_ax.set_title(f"Distribution of {col}")

# 隐藏多余的空白子图(当总图表数不能被每行数量整除时)
for idx in range(total_plots, len(axs)):
    axs[idx].axis('off')

# 自动调整子图间距,避免标签重叠挤压
plt.tight_layout()

# 批量导出到PDF
with PdfPages(PDF_SAVE_PATH) as pdf:
    pdf.savefig(fig, bbox_inches='tight')

# Jupyter中渲染显示最终排版效果
plt.show()

关键逻辑说明

  • PDF批量导出:通过matplotlib内置的PdfPages模块创建PDF写入流,所有子图绘制完成后一次性写入单个文件,无需手动逐张保存
  • 面板排版控制:通过plt.subplots创建网格布局,绘图时给seaborn接口传入ax参数指定绘图位置,修改COLS_PER_ROW参数即可自由切换每行2/3幅图的布局
  • 尺寸设置生效:创建画布时直接通过单图尺寸计算总figsize,所有绘图操作绑定到对应子图坐标轴,彻底解决之前尺寸设置不生效、图表被挤压的问题;最后调用tight_layout()自动调整子图边距,避免标题、坐标轴标签被遮挡

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:51:16