【发布时间】:2014-03-26 16:24:08
【问题描述】:
我想在 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()
这会产生以下情节:
显然红色框太小了。我认为保罗的回答here 发现了同样的问题。黑匣子看起来很棒,但我不能使用 MacOSX 后端,或者任何其他没有方法figure.canvas.get_renderer()。
如果重要的话,我使用的是 Mac OS X 10.8.5、Matplotlib 1.3.0 和 Python 2.7.5
【问题讨论】:
-
问题是文本大小在渲染之前是未知的。 osx 后端问题是由于石英事件循环的工作方式,您只能在回调 (iirc) 中渲染。你需要边界框做什么?如果是画一个盒子,我想annotate会帮你做的。
-
并确保所有渲染器上的 dpi 都是正确的(屏幕空间以像素为单位)。
-
我正在使用边界框来帮助我确定文本框与其他内容的距离。我通常将文本放置在任意位置,获取它的边界框,然后将文本移动到它的最终位置,部分基于边界框的大小。至于dpi,我知道
figure.canvas.get_renderer()的dpi怎么设置,但是mpl.backend_bases.RendererBase()的dpi怎么设置呢? -
我怀疑你可以通过巧妙地使用 ha 和 va 来做很多你想做的事情。还可以看看紧密边界框代码是如何工作的。
-
我认为水平对齐 (ha) 和/或垂直对齐 (va) 在许多情况下都不够用。假设我想让两行文本堆叠在一起。一条线很长,另一条线很短。我可以使用 ha 确保顶线的水平中心位于底线的水平中心的正上方。但是,如果我希望长线的左侧位于某个坐标处呢?我需要知道边界框的左边缘在哪里。感谢您对紧密边界框代码的建议。我去看看。
标签: python matplotlib