Matplotlib:将文本与轴刻度对齐

4

我想在我的图表y轴旁边显示自定义文本,就像这个最简化的例子:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.text(-0.05, 0.5, '$x$')
plt.show()

水平对齐方式0.05是我通过试错得出的结果。不幸的是,0.05只适用于特定大小的绘图窗口。

对于默认窗口大小,文本位置正好符合我的要求:

enter image description here

但是一旦我放大绘图窗口,我的文本就会丢失在无人区:

enter image description here

我尝试过 ax.text(-ax.yaxis.get_tick_padding, 0.5, '$x$'),但填充好像是用不同的单位测量的。
如何确保我的文本在每个窗口大小下与y轴具有相同的距离?
2个回答

3
您可以使用ax.annotate来替代ax.text,因为它允许更多的自由度。具体来说,它允许以不同的坐标系注释某个点,并将文本偏移至该位置的不同坐标系中。
以下代码会在给定yaxis_transform坐标系(即(axes coordinates, data coordinates))中,在位置(0, 0.5)处创建一个注释。然后,文本本身从此位置偏移-5个点。
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.annotate('$x$', xy=(0, 0.5), xycoords=ax.get_yaxis_transform(),
                   xytext=(-5,0), textcoords="offset points", ha="right", va="center")

plt.show()

请注意,-5 只是一个估计值,您可能需要自己找到最佳值。但是,一旦完成此操作,只要标签的填充和字体大小不改变,它就会保持不变。

在这里输入图片描述


请参考此问题以了解如何更新注释。 - ImportanceOfBeingErnest
谢谢!但是这些解决方案对我不起作用... set_position().xy 都会设置 xy 参数并覆盖 xytext 的设置。在动画中如何更改 xy 而不更改 xytext;或者如何更新 xytext - Elias Strehle
正如链接答案中所示,该解决方案有效。因此,如果它对您无效,则需要查看能够重现问题的代码 - 不过我认为这应该是一个新的问题。 - ImportanceOfBeingErnest

1
当刻度线长度或填充已更改时,您可以通过查询其中一个刻度线来找到确切的偏移量。 刻度线有一个“pad”(标签和刻度之间的距离)和一个“padding”(刻度线的长度),都以“点”为单位进行测量。 在默认设置中,两者都是3.5,给出了一个填充值7
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

tick = ax.yaxis.get_major_ticks()[-1]
padding = tick.get_pad() + tick.get_tick_padding()
ax.annotate('$half$', xy=(0, 0.5), xycoords=ax.get_yaxis_transform(),
                   xytext=(-padding,0), textcoords="offset points", ha="right", va="center")

plt.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接