matplotlib图例位置默认值

时间:2014-12-17 22:31:27

标签: python matplotlib legend

我经常使用legend(loc='best')。我注意到,如果有足够的空间,它似乎默认为右上角。但是,我希望loc='best'默认为左上角。 (怎么样)有可能改变这种行为吗?

2 个答案:

答案 0 :(得分:3)

您可以在matplotlib中重新定义找到最佳位置的方法

它在here

正如下面的@BrenBarn评论,并在他的回答中提到,神奇发生在_get_anchored_bbox,第875行。

添加:

from matplotlib.legend import Legend

def _get_anchored_bbox(self, loc, bbox, parentbbox, renderer):
  assert loc in range(1, 11)  # called only internally
  BEST, UL, UR, LL, LR, R, CL, CR, LC, UC, C = list(xrange(11))
  anchor_coefs = {UR: "NE", UL: "NW", LL: "SW", LR: "SE", R: "E",
                  CL: "W", CR: "E", LC: "S", UC: "N", C: "C"}

  c = anchor_coefs[loc]

  fontsize = renderer.points_to_pixels(self._fontsize)
  container = parentbbox.padded(-(self.borderaxespad) * fontsize)
  anchored_box = bbox.anchored(c, container=container)
  return anchored_box.x0, anchored_box.y0         

Legend._get_anchored_bbox = _get_anchored_bbox

在代码的顶部,它会改变行为。我删除了注释并稍微改变了间距,以减少占用空间。或者,您可以将其转储到另一个文件中,将其称为legendLocationHack.py并在需要时立即调用它。

答案 1 :(得分:3)

你可以monkeypatch matplotlib.legend.Legend._get_anchored_bbox。此函数包含以下代码:

BEST, UR, UL, LL, LR, R, CL, CR, LC, UC, C = list(xrange(11))

anchor_coefs = {UR: "NE",
                UL: "NW",
                LL: "SW",
                LR: "SE",
                R: "E",
                CL: "W",
                CR: "E",
                LC: "S",
                UC: "N",
                C: "C"}

这映射了顺序"位置代码"到空间位置。 _find_best_position中的坏法计算代码通过采取序列中最早的位置来打破不良关系,因此右上角将获胜,除非另一个位置实际上更好。我认为您可以安全地交换代码,方法是将新版本的函数更改为第一行:

 BEST, UL, UR, LL, LR, R, CL, CR, LC, UC, C = list(xrange(11))

请注意,我切换了UL和UR。当我在一个简单的V形图上尝试这个时,它会在更改前将图例放在右上角,但在更改后左上角。

要更改中的monkeypatch,您应重新定义自己的_get_anchored_bbox版本,然后执行matplotlib.legend.Legend._get_anchored_bbox = my_get_anchored_bbox

任何这种monkeypatched解决方案都应该被视为脆弱的。如果稍后的matplotlib版本中的某些内容发生变化,它可能会中断,因为它涉及覆盖您不应该混淆的内部函数。在matplotlib邮件列表上询问或者在bug跟踪器中提出问题可能是一个更好的主意,要求可配置的参数设置打破平局订单。