matplotlib多子图各带colorbar时y轴标签对齐问题求解
问题原因
为每个子图单独添加colorbar时,matplotlib会自动压缩对应子图的宽度以放置colorbar,加上不同子图的y轴刻度标签长度不一致,会导致各个子图的左边缘坐标不统一。原生fig.align_labels()是基于子图边缘计算标签对齐位置的,因此会出现标签重叠错位的问题。
解决方案
最简便的实现方式是统一手动指定所有y轴标签的水平偏移位置,无需依赖fig.align_labels(),修改后的可运行代码如下:
import matplotlib.pyplot as plt import matplotlib.ticker as mtick import numpy as np x = np.array(np.arange(5)) y = [np.random.uniform(0.5,2,5)*np.random.random(5)+100, # 长刻度标签 np.random.uniform(0.5,2,5)*np.random.random(5)+100, # 长刻度标签 np.random.uniform(0.5,2,5)*np.random.random(5), # 短刻度标签 np.random.uniform(0.5,2,5)*np.random.random(5)] # 短刻度标签 fig = plt.figure() for plotnum,yvals in enumerate(y): ax = fig.add_subplot(2,2,plotnum+1) sc = ax.scatter(x,yvals,c=yvals) fig.colorbar(sc, ax=ax) ax.set(ylabel=f'Y Values {plotnum}', xlabel=f'X Values {plotnum}') ax.yaxis.set_major_formatter(mtick.StrMethodFormatter('{x:,.1f}')) # 统一设置y轴标签的水平位置,所有子图使用相同的第一个参数即可对齐 ax.yaxis.set_label_coords(-0.35, 0.5) plt.tight_layout() plt.subplots_adjust(wspace=0.8, hspace=0.6) plt.show()
参数说明
set_label_coords的第一个参数是标签相对于子图左边缘的水平坐标,负值代表位于子图外侧,你可以根据自己的刻度标签长度调整这个数值,所有子图保持一致即可实现垂直对齐。- 如果需要自适应不同刻度长度的场景,可以先遍历所有子图计算出最大的标签偏移量,再统一赋值给所有子图的y轴标签,适配性更强。
内容的提问来源于stack exchange,提问作者Matt P
相关产品推荐
相关产品推荐

