Matplotlib文本边界框尺寸

dmo*_*nch 6 python macos matplotlib

我想做的事:

我想在matplotlib世界单位(而不是屏幕像素)中获取文本实例的位置和尺寸,以计算和防止文本重叠.

我正在开发Mac OSX 10.9.3,Python 2.7.5,matplotlib 1.3.1.

我尝试过的:

t为文本实例.

  1. t .get_window_extent(渲染器):

    这得到了像素的边界框尺寸,我需要世界坐标(在我的情况下归一化在-1.0和1.0之间).

  2. t ._get_bbox_patch():

    t = ax.text(x, y, text_string, prop_dict, bbox=dict(facecolor='red', alpha=0.5, boxstyle='square'))
    print t._get_bbox_patch()
    
    Run Code Online (Sandbox Code Playgroud)

    当我执行上面的序列时,输出是FancyBboxPatchFancyBboxPatch(0,0;1x1).在我生成的图像中,文本实例使用红色边界框正确渲染,因此输出使我认为FancyBbox已实例化,但在渲染时间之前实际上并未填充实际尺寸.

那么,如何在我用于传递给xy参数的相同坐标系统单元中获取文本实例的边界框的位置和尺寸ax.text(...)

DrV*_*DrV 8

这可能会有所帮助.

import matplotlib.pyplot as plt

f = plt.figure()
ax = f.add_subplot(111)
ax.plot([0,10], [4,0])
t = ax.text(3.2, 2.1, "testing...")

# get the inverse of the transformation from data coordinates to pixels
transf = ax.transData.inverted()
bb = t.get_window_extent(renderer = f.canvas.renderer)
bb_datacoords = bb.transformed(transf)

# Bbox('array([[ 3.2       ,  2.1       ],\n       [ 4.21607125,  2.23034396]])')
Run Code Online (Sandbox Code Playgroud)

这应该给你想要的.如果你想得到图坐标(0..1,0..1)的坐标,那么使用倒数ax.transAxes.

但是,这个解决方案有一个小问题.摘自matplotlib文档:

任何Text实例都可以在窗口坐标中报告其范围(负x坐标在窗口外),但是有一个问题.

RendererBase实例(用于计算文本大小)在绘制图形(draw())之前是未知的.绘制窗口并且文本实例知道其渲染器后,您可以调用get_window_extent().

因此,在真正绘制图形之前,似乎无法找出文本大小.

顺便说一句,您可能已经注意到Bbox实例具有overlaps可用于确定是否Bbox与另一个(bb1.overlaps(bb2))重叠的方法.这在某些情况下可能有用,但它没有回答"多少"这个问题.

如果您有旋转的文本,您将很难看到它们是否重叠,但您可能已经知道了.

  • 这对我来说非常有效,唯一的问题是我必须使用“f.canvas.get_renderer()”而不是“f.canvas.renderer”。 (3认同)

Mar*_*cin 5

有点晚了,但这里是另一个示例,它展示了如何获取数据坐标/单位中文本对象的边界框。它还绘制围绕文本获得的边界框以进行视觉表示。

import matplotlib.pyplot as plt

# some example plot
plt.plot([1,2,3], [2,3,4])

t = plt.text(1.1, 3.1, "my text", fontsize=18)

# to get the text bounding box 
# we need to draw the plot
plt.gcf().canvas.draw()


# get bounding box of the text 
# in the units of the data
bbox = t.get_window_extent()\
    .inverse_transformed(plt.gca().transData)


print(bbox)
# prints: Bbox(x0=1.1, y0=3.0702380952380954, x1=1.5296875, y1=3.2130952380952382)


# plot the bounding box around the text
plt.plot([bbox.x0, bbox.x0, bbox.x1, bbox.x1, bbox.x0],
         [bbox.y0, bbox.y1, bbox.y1, bbox.y0, bbox.y0])

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述