我经常使用legend(loc='best')
。我注意到,如果有足够的空间,它似乎默认为右上角。但是,我希望loc='best'
默认为左上角。 (怎么样)有可能改变这种行为吗?
答案 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跟踪器中提出问题可能是一个更好的主意,要求可配置的参数设置打破平局订单。