如何调整matplotlib各子图的y轴标签间距以保持均匀一致
解决方案
你只需要在创建子图时按照每个子图的y轴标签数量设置高度比例,再配合y轴对齐方法就能同时实现标签间距均匀、图表水平对齐的效果,完整可运行代码如下:
import matplotlib.pyplot as plt import numpy as np xa = np.arange(1, 15) xb = np.arange(1, 30) xc = np.arange(1, 5) ya = [f'label{ea}' for ea in xa] yb = [f'label_blablabla{ea}' for ea in xb] yc = [f'label_abcx{ea}' for ea in xc] # 按各子图标签数量设置高度比例,和你单张画布时的高度逻辑保持一致 height_ratios = [len(xa), len(xb), len(xc)] # 通过gridspec_kw传入高度比例,constrained_layout避免元素重叠 fig, axs = plt.subplots(3, 1, figsize=(5, sum(height_ratios)*0.3), gridspec_kw={'height_ratios': height_ratios}, constrained_layout=True) axs[0].barh(ya, xa) axs[1].barh(yb, xb) axs[2].barh(yc, xc) # 强制对齐所有子图的y轴位置,解决标签长度不一导致的水平错位问题 fig.align_ylabels(axs) plt.show()
实现逻辑
- 你之前单张画布的高度规则是
标签数量*0.3,子图模式下将高度比例设置为各子图标签数量的比值,就能保证每个子图内单个y轴标签占用的高度和单张画布时完全一致,自然保持均匀间距 fig.align_ylabels()方法会忽略y轴标签本身的长度,强制将所有子图的y轴左边缘对齐,所有条形图的起始位置就会保持水平对齐constrained_layout参数会自动调整子图、标签的间距,避免内容被截断
内容的提问来源于stack exchange,提问作者Scoodood
相关产品推荐
相关产品推荐

