首页 > 解决方案 > ax.text 对 (x,y) 使用组合的 transData 和 transAxes

问题描述

我试图在同一个图中打印一组线,并在轴的顶部,每行上方写一些文本。我使用每组数据的 x 的最小值作为文本的位置。代码看起来像

for i in range(jobs):
  ax.text(xmin,1.15, nameid, rotation=45, ha='left', fontsize=tinyfont, color='k', va='center')

当我这样做时,会打印文本 - 但在图表中间(因为它使用数据坐标): 文本打印在错误的位置

因为我想在轴上方打印,所以我使用 thentransform=ax.transAxes在上方打印,如

for i in range(jobs):
  ax.text(xmin,1.15, nameid, transform=ax.transAxes, rotation=45, ha='left', fontsize=tinyfont, color='k', va='center')

尽管文本移动到了正确的位置,但只有第一个被写入: 只有第一个文本被打印在正确的位置

编辑:发生这种情况是因为位置高于轴限制 1.0。因此,对于 x 位置,我想使用数据值 xmin;对于 y,我想要在轴上方的固定位置。问题是我事先不知道最终的 x_lim 和 y_lim,因为我循环数据并绘制不同的部分。

如何使用数据的 x 添加文本,但在轴上方的常量“y”中?

标签: pythonmatplotlibtexttransform

解决方案


您想使用“混合变换”,其中您使用 x 轴的数据坐标和 y 轴的轴坐标。这记录在这里:

https://matplotlib.org/stable/tutorials/advanced/transforms_tutorial.html#blended-transformations

一个简单的例子是:

import matplotlib.transforms as transforms

fig, ax = plt.subplots()

trans = transforms.blended_transform_factory(ax.transData, ax.transAxes)

# code to plot, and find xmin, etc...

ax.text(xmin, 1.15, nameid, rotation=45, ha='left', fontsize=tinyfont,
        color='k', va='center', transform=trans) 

请注意,在文档站点上,它提到了一个快捷方式:

x 位于数据坐标中,y 位于轴坐标中的混合转换非常有用,以至于我们有帮助方法来返回 Matplotlib 在内部用于绘制刻度、刻度标签等的版本。方法是matplotlib.axes.Axes.get_xaxis_transform()matplotlib.axes.Axes.get_yaxis_transform()。所以在上面的例子中,调用blended_transform_factory()可以替换为get_xaxis_transform

trans = ax.get_xaxis_transform()

所以,你可以只使用:

ax.text(xmin, 1.15, nameid, rotation=45, ha='left', fontsize=tinyfont,
        color='k', va='center', transform=ax.get_xaxis_transform()) 

推荐阅读