Matplotlib:图例标题的对齐方式

33
在matplotlib中,我该如何调整图例标题的对齐方式?它总是居中显示,但我需要它与图例框左对齐。我尝试更改标题的Text artist的对齐方式,但没有效果。请参见以下示例以获取详细信息:
from pylab import *

x = linspace(0, 1)
plot(x, x, label="1")
plot(x, x**2, label="2")
plot(x, x**3, label="3")
plot(x, sqrt(x), label="square root")

l = legend(title="Title", loc="best")
l.get_title().set_ha("left")               # <== does not work

show()
问题归结为什么和谁控制标题对齐的锚点?将对齐方式更改为“右侧”或“中心”会产生明显影响。第二个观察结果:对于较长的标题字符串,锚点会移动到图例框的左边界...

标题文本默认情况下实际上是“左对齐”的。对齐的锚点位于图例框的中心。是否可以指定不同的锚点?或许与图例相关联的VPacker或HPacker实例可以提供帮助? - Erwin411
对于我的当前情况,我有一个解决方案:只需说l.get_title().set_ha("center")。然后,文本将以神秘的锚点居中显示(该锚点大致位于手柄和标签文本之间),效果很好。然而,对于一个“非常超长的标题”,锚点会移动到框的左边界... - Erwin411
set_ha('left') 无效相同的问题。 - Jimi Oke
我也很想找到这个问题的更好答案。set_ha('left') 不起作用,我的另一个选项 plt.setp(legend.get_title(), horizontalalignment='left') 也不行。 - jprockbelly
3个回答

45

您可以设置完整的图例框架,使用leg._legend_box.align。这将对图例框内的所有内容进行对齐,但效果是使标题位于框的两侧而不是中央。

  • 左对齐

leg = plt.legend(title="Title")
leg._legend_box.align = "left"

enter image description here

  • 右对齐

    leg = plt.legend(title="Title")
    leg._legend_box.align = "right"
    

    在此输入图片描述


  • 6

    自matplotlib 3.6版本起,有了alignment参数。 在文档中,你可以读到:

    alignment {'center','left','right'},默认为:'center'

    图例标题和条目方框的对齐方式。 条目被对齐为单个块,因此标记始终对齐。

    现在你可以简单地调用

    plt.legend(title='Title', alignment='left')
    

    6
    我认为您需要使用set_position((x, y))方法来移动Text对象的位置。xy的单位是像素,因此您需要尝试不同的值来找到合适的位置,或者使用Transform。我不确定哪种Transforms组合最有用。

    简而言之,以下内容可能有效:

    l.get_title().set_position((-10, 0)) # -10 is a guess
    

    5
    谢谢!set_position()确实移动了标题。但我不想将偏移量硬编码,而是希望从框范围计算它。这似乎变得相当复杂... - Erwin411
    如果在.png和.pdf文件格式之间进行更改,则会产生不一致的定位。 - Jason Callahan

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接