matplotlib 什么样的文本对象是轴标签?

kupeojn6  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(83)

轴标签(axis.xaxis.label)看起来是matplotlib.text.Text对象,但是当提取位置并试图在同一位置手动创建文本时,似乎有一个很大的偏移。在下面的例子中,我希望红色的“x”正好与黑色的“x”重叠,但事实并非如此。

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.set_xlabel('x')
label = ax.xaxis.label
pos = label.get_position()
pos_display = label.get_transform().transform(pos)
label_red = plt.text(pos_display[0], pos_display[1], 'x', transform=None, fontdict={'color': 'r'})
plt.show()

此外,我无法深度复制标签Text对象。在下面的例子中,我希望蓝色的“x”会覆盖黑色的,但它只是没有显示在图中。如果我试图复制label_red而不是label,那么确实蓝色的“x”会覆盖红色的。

from copy import copy
label_blue = copy(label)
label_blue.set_color('b')
ax.add_artist(label_blue)
plt.show()

那么,轴标签文本对象有什么特别之处呢?我的最终目标是在同一个轴上有一个二级标签。

tmb3ates

tmb3ates1#

一些Matplotlib对象直到绘制时才知道它们的真实位置。对于任何相对于其他艺术家具有位置的对象来说尤其如此。我们可以使用fig.draw_without_rendering强制绘制而无需实际创建绘图,然后标签的位置是已知的。此外,xlabel的垂直和水平对齐与使用ax.text时的默认对齐不同(或plt.text),因此您需要指定它们来匹配(请参阅下面的 hava 关键字)。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.set_xlabel('x')
fig.draw_without_rendering()

label = ax.xaxis.label
pos = label.get_position()
pos_display = label.get_transform().transform(pos)
label_red = plt.text(pos_display[0], pos_display[1], 'x', transform=None,
                     fontdict={'color': 'r'}, va='top', ha='center')
plt.show()

相关问题