文本换行仅适用于 matplotlib 中的垂直标签

Text wrapping works only for vertical labels in matplotlib

考虑下图,我们使用文本换行将相同的数据绘制到带有垂直标签的面板 A 和带有水平标签的面板 B 中。

import matplotlib.pyplot as plt

x = "Very long label"
y = "Even much longer label"
z = "Now this is what I call a really long label"

l = [x, y, z]
d = [3, 1, 4]

fig, (axA, axB) = plt.subplots(1, 2, figsize=(10, 5))

axA.bar(l, d)
font_dictA={"va": "center", "ha": "right", "rotation": 90, "wrap": True}
axA.set_xticklabels(l, fontdict= font_dictA)
axA.set_title("Case A: vertical labels")

axB.bar(l, d)
font_dictB={"va": "top", "ha": "center", "rotation": 0, "wrap": True}
axB.set_xticklabels(l, fontdict= font_dictB)
axB.set_title("Case B: horizontal labels")

plt.subplots_adjust(bottom=0.2)
plt.show()

给出以下输出:

我假设文本换行不适用于水平标签是由于边界框计算的差异引起的,边界框计算是通过考虑轴和边界(垂直标签)而不是相邻标签文本框(水平标签)来确定的).我们可以轻松地为水平标签设置标签的文本框尺寸吗(想想:定义它们的最大宽度)?
请注意,我只想用 matplotlib 功能包装 labels/legends/text 的文本;我不要求像 textwrap 这样的外部库,也不要求像旋转标签这样的其他解决方案。

文字换行不会换行文字以不重叠,它会换行文字当它试图超出图形

对于垂直标签,matplotlib 似乎将文本包装成漂亮的标签,但它只是防止文本超出图形范围。您可以在设置紧密布局时验证这一点 - 不会发生换行,只是轴正在收缩以适应标签,因此无需换行(前提是可能)。

如果水平标签太长以至于它们会超出图形,它们将被包裹,但只有那些会超出图形的标签。

另请参阅 Text#_get_wrapped_text()

中的 this source code comment

Return a copy of the text with new lines added, so that the text is wrapped relative to the parent figure.