首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >matplotlib:获取`bbox_inches=tight`的生成边界框

matplotlib:获取`bbox_inches=tight`的生成边界框
EN

Stack Overflow用户
提问于 2015-02-24 10:11:18
回答 1查看 2.5K关注 0票数 7

我经常用matplotlib生成个人数字,这些数字应该是垂直或水平对齐的,例如在LaTeX文档中。我的目标是:

  1. 避免过高的毛边或剪裁所有的数字。对于独立的数字,这是很容易解决的使用bbox_inches='tight'savefig
  2. 对所有图形使用完全相同的边框,因为我希望我的轴元素在结果文档中很好地对齐。

我目前的解决方案是一种非常不方便的尝试和错误方法:我手动尝试猜测合理的利润率,并通过plt.subplots_adjust()设置它们。这通常需要很长时间,直到我得到一个满意的结果。

我想知道是否有可能将bbox_inches='tight'的功能与plt.subplots_adjust()结合起来?是否有可能以编程的方式获得bbox_inches='tight'的结果边框?这将使我能够确定有最大轴标签/标题的图形的边框,并对所有其他数字使用这个边框。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-24 14:15:11

感谢@Schorsch和@tcaswell指出ax.get_tightbbox几乎解决了这个问题。唯一棘手的部分是将依赖于呈现程序的bbox转换为“英寸”的bbox。一般的解决办法是:

代码语言:javascript
复制
tight_bbox_raw = ax.get_tightbbox(fig.canvas.get_renderer())
tight_bbox = TransformedBbox(tight_bbox_raw, Affine2D().scale(1./fig.dpi))

现在,我也可以在我的其他绘图中重用tight_bbox,从而生成漂亮的、相同方框的数字。

我还编写了一个小助手类--不是优雅的,而是有用的:我为我创建的每一个图形调用了max_box_tracker.add_figure,它将在内部更新一个最大的边界框。在生成所有绘图之后,我可以打印出生成的边框(直接以代码的形式添加到我的脚本中)。

代码语言:javascript
复制
class MaxBoxTracker:
  def __init__(self):
    self.box = None
  def add_figure(self, fig, ax):
    from matplotlib.transforms import TransformedBbox, Affine2D
    box_raw = ax.get_tightbbox(fig.canvas.get_renderer())
    box = TransformedBbox(box_raw, Affine2D().scale(1./fig.dpi)).get_points()
    if self.box is None:
      self.box = box
    else:
      self.box[0][0] = min(self.box[0][0], box[0][0])
      self.box[0][1] = min(self.box[0][1], box[0][1])
      self.box[1][0] = max(self.box[1][0], box[1][0])
      self.box[1][1] = max(self.box[1][1], box[1][1])
  def print_max(self):
    print 'Code to set maximum bbox:\nfrom matplotlib.transforms import Bbox\ntight_bbox = Bbox([[%f, %f], [%f, %f]])' % (
      self.box[0][0], self.box[0][1], self.box[1][0], self.box[1][1]
    )
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28692981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档