Matplotlib中如何用plt.subplots实现指定布局的多子图排布
matplotlib 非等分布局子图实现方案
你需要的「左列单图占满全高、右列上下排布两个子图、列宽不等」的布局,直接用gridspec配置网格比例即可实现,不需要手动拖拽调整子图位置,还能完全复用你之前写好的单图绘图逻辑。
核心实现代码
import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec # 总画布尺寸可按需调整,保持纵向比例和你原单图一致即可 fig = plt.figure(figsize=(12, 10)) # 定义2行2列的基础网格,自定义宽高比例 gs = gridspec.GridSpec( nrows=2, ncols=2, width_ratios=[1, 1.3], # 左右列宽度比,可根据实际效果微调 height_ratios=[1, 1], # 右列上下子图等高 wspace=0.3, # 左右子图水平间距 hspace=0.25 # 右列子图垂直间距 ) # 绑定子图对应位置 ax_left = fig.add_subplot(gs[:, 0]) # 左图:覆盖所有行、第一列 ax_right_top = fig.add_subplot(gs[0, 1]) # 右上图:第一行、第二列 ax_right_bottom = fig.add_subplot(gs[1, 1]) # 右下图:第二行、第二列
使用说明
- 你之前写好的单图绘制逻辑不需要大改,只要把原来
ax = fig.gca()获取到的坐标轴对象,替换成上面生成的三个ax对象传入即可,所有绘图样式、标注都会和原来的单图效果一致。 - 如果你更习惯用
plt.subplots初始化画布,也可以先生成空白画布后再挂载gridspec配置分配子图,逻辑和上述方案完全一致,不需要提前生成规整的子图网格。
参数调整提示
width_ratios、height_ratios的数值可以根据你的实际出图效果微调,直到和目标布局的比例匹配- 如果出现子图标签、标题重叠的问题,适当调大
wspace和hspace的数值即可 - 如果需要给子图加色条、统一坐标轴范围,直接操作对应的ax对象即可,和单图场景的用法没有区别
内容的提问来源于stack exchange,提问作者Atmos
相关产品推荐
相关产品推荐

