gpt4 book ai didi

matplotlib:获取 `bbox_inches=tight` 的结果边界框

转载 作者:行者123 更新时间:2023-12-03 16:45:33 26 4
gpt4 key购买 nike

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

  • 避免在所有图中留出过多的边距或剪裁。对于独立图形,这可以通过使用 bbox_inches='tight' 轻松解决。在 savefig .
  • 对所有图形使用完全相同的边界框,因为我希望我的轴元素在生成的文档中很好地排列。

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

    我想知道是否有可能结合 bbox_inches='tight' 的力量与 plt.subplots_adjust() ?是否可以以编程方式获得 bbox_inches='tight' 的结果边界框? ?这将允许我确定具有最大轴标签/标题的图形的边界框,并将此边界框用于所有其他图形。

    最佳答案

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

    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对于我创建的每个图形,它将在内部更新一个最大边界框。生成所有绘图后,我可以打印出生成的边界框(直接以代码的形式添加到我的脚本中)。
    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]
    )

    关于matplotlib:获取 `bbox_inches=tight` 的结果边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28692981/

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