gpt4 book ai didi

python - 获取文本边界框,独立于后端

转载 作者:太空狗 更新时间:2023-10-29 20:24:17 26 4
gpt4 key购买 nike

我想获取 matplotlib 图中某些文本周围的边界框(尺寸)。本帖here ,帮助我意识到我可以使用方法 text.get_window_extent(renderer) 来获取边界框,但我必须提供正确的渲染器。有些后端没有figure.canvas.get_renderer()方法,所以我尝试了matplotlib.backend_bases.RendererBase()来获取渲染器,但没有产生令人满意的结果.这是一个简单的例子

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

fig = plt.figure()
ax = plt.subplot()
txt = fig.text(0.15,0.5,'afdjsklhvvhwd', fontsize = 36)
renderer1 = fig.canvas.get_renderer()
renderer2 = mpl.backend_bases.RendererBase()
bbox1 = txt.get_window_extent(renderer1)
bbox2 = txt.get_window_extent(renderer2)
rect1 = Rectangle([bbox1.x0, bbox1.y0], bbox1.width, bbox1.height, \
color = [0,0,0], fill = False)
rect2 = Rectangle([bbox2.x0, bbox2.y0], bbox2.width, bbox2.height, \
color = [1,0,0], fill = False)
fig.patches.append(rect1)
fig.patches.append(rect2)
plt.draw()

这会产生以下情节:

image

很明显红框太小了。我认为保罗的回答 here发现了同样的问题。黑盒看起来不错,但我不能使用 MacOSX 后端,或任何其他没有方法 figure.canvas.get_renderer() 的后端。

以防万一,我使用的是 Mac OS X 10.8.5、Matplotlib 1.3.0 和 Python 2.7.5

最佳答案

这是我的解决方案/技巧。 @tcaswell 建议我看看 matplotlib 如何处理带有紧密边界框的保存图形。我找到了 the code对于 Github 上的 backend_bases.py,它将图形保存到一个临时文件对象中,只是为了从缓存中获取渲染器。我将这个技巧变成了一个小函数,如果它存在于后端,则使用内置方法 get_renderer(),否则使用保存方法。

def find_renderer(fig):

if hasattr(fig.canvas, "get_renderer"):
#Some backends, such as TkAgg, have the get_renderer method, which
#makes this easy.
renderer = fig.canvas.get_renderer()
else:
#Other backends do not have the get_renderer method, so we have a work
#around to find the renderer. Print the figure to a temporary file
#object, and then grab the renderer that was used.
#(I stole this trick from the matplotlib backend_bases.py
#print_figure() method.)
import io
fig.canvas.print_pdf(io.BytesIO())
renderer = fig._cachedRenderer
return(renderer)

下面是使用 find_renderer() 的结果,对我的原始示例中的代码稍作修改。使用具有 get_renderer() 方法的 TkAgg 后端,我得到:

TkAgg

使用没有 get_renderer() 方法的 MacOSX 后端,我得到:

MacOSX

显然,使用 MacOSX 后端的边界框并不完美,但它比我原来问题中的红色框要好得多。

关于python - 获取文本边界框,独立于后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22667224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com