Matplotlib紧凑布局:左侧图像+右侧同列色条及跨列标题实现
Matplotlib 实现左侧图像+右侧同列紧凑色条布局及色条跨列标题
优化紧凑布局
你当前代码通过创建多余子图框放置色条,导致布局松散。推荐用GridSpec精准划分画布,直接为色条分配独立轴,彻底消除多余绘图框:
- 用
GridSpec将画布划分为3行2列,左侧列合并为一个大区域放图像,右侧垂直分为三个小区域专门放色条。 - 通过
width_ratios参数控制左右区域宽度比例,让布局更紧凑贴合需求。
添加色条跨列标题
直接用fig.text()定位到右侧色条列的顶部中心,添加统一标题即可,无需额外创建子图。
完整可运行代码
import matplotlib.pyplot as plt import numpy as np from matplotlib.gridspec import GridSpec # 生成示例数据 data1 = np.random.rand(10, 10) data2 = np.random.rand(10, 10) data3 = np.random.rand(10, 10) # 创建画布并划分布局:3行2列,左侧占3行,右侧分3行,左右宽度比例4:1 fig = plt.figure(figsize=(10, 6)) gs = GridSpec(3, 2, width_ratios=[4, 1]) # 左侧图像轴 ax_img = fig.add_subplot(gs[:, 0]) # 右侧三个色条轴 ax_cbar1 = fig.add_subplot(gs[0, 1]) ax_cbar2 = fig.add_subplot(gs[1, 1]) ax_cbar3 = fig.add_subplot(gs[2, 1]) # 绘制图像(此处按原逻辑叠加展示数据,可根据需求修改为单图或多图) im1 = ax_img.imshow(data1, aspect='auto', cmap='viridis') im2 = ax_img.imshow(data2, aspect='auto', cmap='viridis', alpha=0.5) im3 = ax_img.imshow(data3, aspect='auto', cmap='viridis', alpha=0.3) # 将色条绑定到对应轴,实现紧密排列 plt.colorbar(im1, cax=ax_cbar1) plt.colorbar(im2, cax=ax_cbar2) plt.colorbar(im3, cax=ax_cbar3) # 添加色条列的统一标题 fig.text(0.85, 0.95, '带宽 (MHz)', ha='center', va='top', fontsize=12, fontweight='bold') # 微调布局,给标题留出空间 plt.tight_layout() plt.subplots_adjust(top=0.9) plt.show()
额外说明
- 若左侧需要展示3个独立图像,只需将左侧区域也划分为3行,创建3个图像轴与右侧色条轴一一对应即可。
- 可通过调整
width_ratios数值,灵活控制图像区域和色条区域的宽度占比。 - 如果不需要色条的刻度标签,可通过
ax_cbar1.set_yticklabels([])隐藏,进一步优化紧凑度。
内容的提问来源于stack exchange,提问作者Chris Ze Third
相关产品推荐
相关产品推荐

