考虑下面的图,其中我们使用文本换行将相同的数据绘制到面板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功能 Package 标签/图例/文本的文本;我不要求像textwrap这样的外部库,也不要求像旋转标签这样的其他解决方案。
2条答案
按热度按时间mccptt671#
文字绕排不会绕排文字以避免重叠,它会在文字试图超出图形时绕排文字。
对于垂直标签来说,matplotlib似乎会将文本包裹起来以获得漂亮的标签,但它只是防止了文本超出图形。您可以在设置紧凑布局时验证这一点-不会发生包裹,只是轴被收缩以容纳标签,因此不需要包裹它们(如果可能的话)。
如果您使水平标注过长,以至于超出图形范围,则会对其进行折绕,但仅限于超出图形范围的标注。x1c 0d1x
另请参阅
Text#_get_wrapped_text()
中的此源代码注解返回添加了新行的文本副本,以便文本相对于父图形换行。
bttbmeg02#
可以使用此代码旋转文本标签。