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

多画布尺寸设置问题:如何让3×2画布中列间图尺寸不同?

实现3×2布局中列宽不等的绘图

当然可以做到,核心是不要用默认的等宽子图布局,而是通过设置列宽度比例或者子图跨行/跨列来实现第一列放大图、第二列放多个小直方图的需求。下面给出两种常用的matplotlib实现方案:

方法一:使用GridSpec设置列宽比例

GridSpec可以直接指定每行/列的尺寸比例,精准控制布局:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

# 创建画布,设置整体尺寸
fig = plt.figure(figsize=(10, 8))
# 定义3行2列的布局,列宽比例设为3:1(可根据需求调整)
gs = gridspec.GridSpec(3, 2, width_ratios=[3, 1])

# 第一列添加跨3行的大图片
ax_big = fig.add_subplot(gs[:, 0])
# 这里用随机数组模拟图片,实际替换成你的图片路径即可
img = np.random.rand(500, 500)
ax_big.imshow(img, cmap='viridis')
ax_big.set_title('大图片')
ax_big.axis('off')  # 隐藏坐标轴,适配图片展示

# 第二列依次添加3个小直方图
for row in range(3):
    ax_hist = fig.add_subplot(gs[row, 1])
    # 生成模拟数据,实际替换成你的数据
    data = np.random.normal(loc=row-1, scale=1, size=1000)
    ax_hist.hist(data, bins=20, color='skyblue')
    ax_hist.set_title(f'直方图{row+1}')
    ax_hist.tick_params(axis='both', labelsize=8)  # 缩小刻度文字,适配小图

# 自动调整子图间距
plt.tight_layout()
plt.show()

方法二:使用subplot2grid实现跨行布局

subplot2grid通过指定子图的起始位置和跨行/跨列数来实现灵活布局,更直观:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(10, 8))
# 第一列大图片:起始位置(0,0),跨行3行
ax_big = plt.subplot2grid((3, 2), (0, 0), rowspan=3)
ax_big.imshow(np.random.rand(500, 500), cmap='viridis')
ax_big.set_title('大图片')
ax_big.axis('off')

# 第二列三个小直方图,分别放在不同行
ax1 = plt.subplot2grid((3, 2), (0, 1))
ax1.hist(np.random.normal(0, 1, 1000), bins=20)
ax1.set_title('直方图1')

ax2 = plt.subplot2grid((3, 2), (1, 1))
ax2.hist(np.random.normal(2, 1, 1000), bins=20)
ax2.set_title('直方图2')

ax3 = plt.subplot2grid((3, 2), (2, 1))
ax3.hist(np.random.normal(-2, 1, 1000), bins=20)
ax3.set_title('直方图3')

plt.tight_layout()
plt.show()

关键说明

你之前调整figure尺寸只会改变整体画布大小,而上述方法是通过控制子图的相对占比来实现列宽差异,第一列的子图会占据更多水平空间,完美适配大图展示,第二列的小图则紧凑排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:10:09