多画布尺寸设置问题:如何让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
相关产品推荐
相关产品推荐

