Matplotlib:将文本与轴记号对齐

cld4siwp  于 2023-01-05  发布在  其他
关注(0)|答案(2)|浏览(158)

我想在图的y轴旁边显示一个自定义文本,如以下最小示例所示:

import matplotlib.pyplot as plt

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

水平对齐0.05是我通过反复试验弄清楚的。不幸的是,0.05只适合一种大小的绘图窗口。
对于默认窗口大小,文本位于所需位置:

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

我尝试了ax.text(-ax.yaxis.get_tick_padding, 0.5, '$x$'),但填充似乎是在不同的单位测量。
如何确保对于每个窗口大小,文本与y轴的距离相同?

eqzww0vc

eqzww0vc1#

你可以用ax.annotate代替ax.text,因为它允许更多的自由度,特别是它允许在一些坐标系中注解一个点,文本在不同的坐标中偏移到那个位置。
下面将在由yaxis_transform给定的坐标系中的位置(0, 0.5)处创建注解,即(axes coordinates, data coordinates)。然后文本本身从该位置偏移-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也只是一个估计值,您可能会再次希望自己找到最佳值,但是,这样做之后,只要标签的填充和字体大小不变,该值将保持不变。

uoifb46i

uoifb46i2#

当刻度长度或填充已更改时,您可以通过查询其中一个刻度来找出确切的偏移。刻度具有“填充”(标签和刻度线之间)和“填充”(刻度线的长度),两者都以“点”为单位。在默认设置中,两者都是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()

相关问题