如何控制每个子图中我的 y 标签之间的间距(matplotlib)[重复]

Posted

技术标签:

【中文标题】如何控制每个子图中我的 y 标签之间的间距(matplotlib)[重复]【英文标题】:How to control the spacing between my y-labels in each subplots (matplotlib) [duplicate] 【发布时间】:2021-11-07 09:40:20 【问题描述】:

我用这些代码创建了 3 个水平条形图。正如您所见,所有图表上 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'labelea' for ea in xa]
yb = [f'label_blablablaea' for ea in xb]
yc = [f'label_abcxea' for ea in xc]

plt.figure(figsize=(5, len(xa)*.3))
plt.barh(ya, xa)

plt.figure(figsize=(5, len(xb)*.3))
plt.barh(yb, xb)

plt.figure(figsize=(5, len(xc)*.3))
plt.barh(yc, xc)

plt.show()

但是这些数字并没有水平排列,因为 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'labelea' for ea in xa]
yb = [f'label_blablablaea' for ea in xb]
yc = [f'label_abcxea' for ea in xc]

fig, axs = plt.subplots(3, 1, figsize=(5, 10))
axs[0].barh(ya, xa)
axs[1].barh(yb, xb)
axs[2].barh(yc, xc)
plt.show()

但后来这种技术弄乱了每个子图中 y 标签之间的间距。有没有人有更好的想法来使所有子图上的 y 标签之间的间距像第一张图像一样一致?谢谢

【问题讨论】:

具体来说,这个answer 【参考方案1】:

添加gridspec_kw='height_ratios': [len(xa), len(xb), len(xc)] 以初始化子图。

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'labelea' for ea in xa]
yb = [f'label_blablablaea' for ea in xb]
yc = [f'label_abcxea' for ea in xc]

fig, axs = plt.subplots(3, 1, figsize=(5, 10), gridspec_kw='height_ratios': [len(xa), len(xb), len(xc)])
axs[0].barh(ya, xa)
axs[1].barh(yb, xb)
axs[2].barh(yc, xc)

输出:

注意。由于高度包括轴标签和最终标题,结果不会完全均匀(就像在您的第一个解决方案中一样)。但是每张图的行数越高,差异越小,越会向理想值收敛。

【讨论】:

谢谢!它完美无瑕!

以上是关于如何控制每个子图中我的 y 标签之间的间距(matplotlib)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

plotly 图中的最大垂直子图数

Chart.JS - 无法在 Y 轴标签之间添加边距/间距

垂直自动布局子视图

抑制绘图子图中的y轴标签,注释未对齐

iOS:为啥我的子视图在滚动视图中出现大间距

如何对绘图中每一行的 Y 轴标签进行排序?