使用 get_window_extent() 方法和变换选项的 Bbox 坐标不正确

Uncorrect Bbox coordinates with get_window_extent() method and transform option

我遇到了一个奇怪的问题。

所以我的目的是在一张图片下方绘制一个矩形,并在图片周围绘制文字。 然后我创建了一个新轴并将两个字符串放在它的顶部和右侧(使用 transform=ax_img.transAxes option).

然后我使用r = fig.canvas.get_renderer() get_window_extent(renderer=r)函数获取图像和字符串的坐标,并用它绘制一个矩形。

from matplotlib import pyplot as plt
from matplotlib.patches import Rectangle


fig, ax  = plt.subplots()

flash_pic = plt.imread("./statics/images/flash_decrease.png")

ax_img = fig.add_axes([0.3,0.3,0.1,0.1], aspect='equal')
ax_img.imshow(flash_pic)

str_up = "This is"
str_right = "a random string"

text_up = ax_img.text(0, 1.1, str_up, fontsize=14, transform=ax_img.transAxes)
text_right = ax_img.text(1.1, 0, str_right, fontsize=14, transform=ax_img.transAxes)

r = fig.canvas.get_renderer()

x0 = text_up.get_window_extent(renderer=r).transformed(ax_img.transAxes.inverted()).x0
x1 = text_right.get_window_extent(renderer=r).transformed(ax_img.transAxes.inverted()).x1
y0 = text_right.get_window_extent(renderer=r).transformed(ax_img.transAxes.inverted()).y0
y1 = text_up.get_window_extent(renderer=r).transformed(ax_img.transAxes.inverted()).y1

width = x1 - x0
height = y1 - y0
rect = ax.add_patch(Rectangle((x0, y0), width, height, transform=ax_img.transAxes, color='red'))

plt.show()

See image here

如您所见,我再次使用图像轴绘制矩形,但我也尝试了“主”轴 ax,但它也不起作用。我也尝试了其他方式来放置文本和图像,但这种方式对我来说是最方便的。我认为它应该像这样工作! 所以问题是矩形坐标不正确,尤其是右坐标x1。如果我要全屏而不是缩小 window.

,它甚至会更改渲染

我在其他地方几乎没有看到关于这个主题的解决方法,所以我想知道是否有人有很好的解释/解决方案来解决这个问题。我尝试了几种组合来获得正确的坐标或更改 transform = ... 选项但没有成功。

谢谢!

enter image description here

matplotlib 只是猜测你的字体有多大,在你画之前它是一个糟糕的字体。因此,这是在获取范围之前应使用 fig.canvas.draw(很快将在 v3.5 中变为 fig.draw_without_rendering())强制平局的罕见情况之一:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
from matplotlib.patches import Rectangle

fig, ax  = plt.subplots()

ax_img = fig.add_axes([0.3,0.3,0.1,0.1], aspect='equal')
ax_img.imshow(np.random.randn(30, 30))

str_up = "This is"
str_right = "a random string"

text_up = ax_img.text(0, 1.1, str_up, fontsize=14, transform=ax_img.transAxes)
text_right = ax_img.text(1.1, 0, str_right, fontsize=14, transform=ax_img.transAxes)

r = fig.canvas.get_renderer()

fig.canvas.draw()

x0 = text_up.get_window_extent(renderer=r).transformed(ax_img.transAxes.inverted()).x0
x1 = text_right.get_window_extent(renderer=r).transformed(ax_img.transAxes.inverted()).x1
y0 = text_right.get_window_extent(renderer=r).transformed(ax_img.transAxes.inverted()).y0
y1 = text_up.get_window_extent(renderer=r).transformed(ax_img.transAxes.inverted()).y1

width = x1 - x0
height = y1 - y0

rect = ax.add_patch(Rectangle((x0, y0), width, height, transform=ax_img.transAxes, color='red'))

plt.show()