Matplotlib子图中共享水平颜色条与底部轴对齐问题
解决Matplotlib多子图共享水平颜色条的定位问题
我完全懂你这种困扰——给3行1列的子图加共享水平色条时,手动用add_axes()计算位置实在太麻烦,还容易出错。其实Matplotlib有更省心的方法,不用自己硬凑坐标轴位置,给你分享两种靠谱的方案:
方案1:用Gridspec预留色条位置
提前通过gridspec_kw给色条留好专门的区域,这样色条的位置和子图完美对齐,不会乱飘。示例代码如下:
import numpy as np import matplotlib.pyplot as plt # 生成测试数据 im = np.random.rand(512, 512) # 创建子图时预留色条位置,height_ratios控制每行高度比例 fig, axs = plt.subplots(3, 1, figsize=(4, 9), gridspec_kw={'height_ratios': [1, 1, 1, 0.05]}) # 移除最后一个用于放色条的坐标轴的边框 axs[-1].axis('off') # 绘制三个子图,收集imshow返回的对象 ims = [] for ax in axs[:-1]: im_obj = ax.imshow(im, cmap='viridis') ims.append(im_obj) # 在预留的位置添加水平色条 fig.colorbar(ims[0], cax=axs[-1], orientation='horizontal') plt.tight_layout() plt.show()
方案2:让Matplotlib自动调整布局
直接用fig.colorbar()的ax参数指定所有子图,它会自动在子图下方创建共享色条,还会自动调整子图间距,完全不用手动计算位置:
import numpy as np import matplotlib.pyplot as plt im = np.random.rand(512, 512) fig, axs = plt.subplots(3, 1, figsize=(4, 9)) ims = [] for ax in axs: im_obj = ax.imshow(im, cmap='viridis') ims.append(im_obj) # 给所有子图添加共享水平色条,shrink控制色条长度,pad控制和子图的间距 fig.colorbar(ims[0], ax=axs, orientation='horizontal', shrink=0.8, pad=0.05) plt.show()
这两种方法都比手动用add_axes()靠谱得多,尤其是第二种,几乎不用操心位置的问题,Matplotlib会帮你搞定所有布局细节。
内容的提问来源于stack exchange,提问作者Wall-E
相关产品推荐
相关产品推荐

