在地物坐标中获取Matplotlib注释标签的坐标

2024-05-17 12:14:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道Matplotlib图中文本注释的边界矩形的坐标。但是,当我试图访问与注释相关联的补丁的“扩展”时,无论文本标签的大小,我都得到Bbox(x0=-0.33, y0=-0.33, x1=1.33, y1=1.33)。这些坐标似乎与IdentityTransform相关,但不会转换成任何有意义的分数坐标。 在理想情况下,如何获得右下角的坐标?在

示例:

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return 10 * np.sin(3*x)**4

x = np.linspace(0, 2*np.pi, 100)
y = f(x)

fig, ax = plt.subplots()
ax.plot(x,y)

xpt = 1.75
ypt = f(xpt)
xy = ax.transData.transform([xpt, ypt])
xy = fig.transFigure.inverted().transform(xy)

xytext = xy + [0.1, -0.1]
rdx, rdy = 0, 1
ann = ax.annotate('A point', xy=xy, xycoords='figure fraction',
             xytext=xytext, textcoords='figure fraction',
             arrowprops=dict(arrowstyle='->', connectionstyle="arc3",
                             relpos=(rdx, rdy)),
             bbox=dict(fc='gray', edgecolor='k', alpha=0.5),
             ha='left', va='top'
            )

enter image description here

^{pr2}$

给出:

[[-0.33 -0.33]
 [ 1.33  1.33]]

c = patch.get_transform().transform(patch.get_extents())
print(c)

给出:

[[-211.2 -158.4]
 [ 851.2  638.4]]

这些可能是显示坐标,但它们与我想要的属性的标签的位置和大小不符。在


Tags: 文本importasnpfigtransformplt标签
1条回答
网友
1楼 · 发布于 2024-05-17 12:14:38

在绘制图形之前,text对象的边界框只包含框相对于内部文本的坐标。在

因此有必要先绘制图形,然后访问边界框。

fig.canvas.draw() 
patch = ann.get_bbox_patch()
box  = patch.get_extents()
print box
#prints: Bbox(x0=263.6, y0=191.612085684, x1=320.15, y1=213.412085684)

因为这些是显示单位中方框的坐标,所以需要将它们转换为图形单位

^{pr2}$

这将返回文本周围矩形的边界框(以图形单位表示,范围从0到1)。在

如果需要坐标轴,则

ax.transAxes.inverted().transform(box)

或者如果需要数据坐标

ax.transData.inverted().transform(box)


如果文本本身的边界框是所要求的,那么可以使用get_window_extent()方法,matplotlib.text.Text并提供注释对象作为参数。使用
box = matplotlib.text.Text.get_window_extent(ann)
print box
# prints Bbox(x0=268.0, y0=196.012085684, x1=315.75, y1=209.012085684)

您可以按上述步骤来获得数字单位的方框。在

相关问题 更多 >