Matplotlib: 用.get_window_extent()定位轴标签位置

问题描述 投票:0回答:1

我想用 ax.text() 旁边的yAxis标签。为此,我读出标签的位置,并像这样变换。

labelpos = ax.yaxis.label.get_window_extent()
box = labelpos.transformed(ax.transAxes.inverted())

为了控制位置,我使用了一个矩形 .patches 像这样。

rect = Rectangle((box.xmin,box.ymin),box.width,box.height,
                  clip_on=False, fill=False, transform= ax.transAxes,ec='r', zorder=1000)
ax.add_patch(rect)

这就是结果

enter image description here

正如你所看到的,位置并不总是正确的 As you can see, the position is not always right. 看起来好像是ticklabel的宽度有关系。我怎样才能补偿这个问题呢?.get_ticklabel_extents,将其转换并创建一个矩形。

extents1, extents2 = ax.yaxis.get_ticklabel_extents(renderer = fig.canvas.get_renderer())
box = extents2.transformed(ax.transAxes.inverted())

这就是结果

enter image description here

但是,当标签上的刻度线变长时,仍然有相同的偏移量。任何想法?


EDIT:

经过一些研究,我发现我的问题可能会更深一层,对于...matplotlib.artist.Artist.get_window_extent 它说 从此:

使用此功能时要注意,如果艺术家的窗口范围发生变化,结果将不会更新。

所以......会不会是标签被艺术家移动了,所以无法读出当前位置?

python matplotlib label position
1个回答
0
投票

解决方案:使用 复合标注有了这个功能,就可以将注解精确地定位到 axislabel 上。

                    an1 = par.annotate("text", xy=(0, 0), xycoords=ax.yaxis.label,
                                        xytext=(0, -20), textcoords="offset points",
                                         va="center", ha="left",rotation=90)

在这里回答。matplotlib论坛

© www.soinside.com 2019 - 2024. All rights reserved.