使用 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()
我遇到了一个奇怪的问题。
所以我的目的是在一张图片下方绘制一个矩形,并在图片周围绘制文字。
然后我创建了一个新轴并将两个字符串放在它的顶部和右侧(使用 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()