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
相关产品推荐
相关产品推荐

