Matplotlib图例中的文本对齐

24
我想将 matplotlib 图表轴中图例条目的对齐方式更改为右对齐(默认是左对齐),但是似乎找不到任何实现此操作的方法。我的设置如下所示:
(我已使用 ax.plot() 命令将数据和标签添加到了 my_fig 轴上)
ax = my_fig.get_axes()[0]
legend_font = FontProperties(size=10)
ax.legend(prop=legend_font, num_points=1, markerscale=0.5)

matplotlib Axes文档中有一个图例关键字参数列表,但似乎没有直接设置图例条目对齐方式的简单方法。有人知道通过后门实现这个目标的方法吗?谢谢。
编辑:
为了澄清我的目标,现在我的图例看起来像:
Maneuver: 12-OCT-2011 12:00 UTC 

Bias: 14-OCT-2011 06:00 UTC

我希望它看起来像:

Maneuver: 12-OCT-2011 12:00 UTC 

    Bias: 14-OCT-2011 06:00 UTC

1
你的标签文本是否包含多行?如果是,你可以使用label_text.set_multialignment('right')。 - Gökhan Sever
我不确定我理解你的意思。对于标签,我有一个简短的描述和日期。所以现在,图例上的描述是堆叠在左侧对齐的,我希望所有的日期都能堆叠(右对齐)。我已经在我的主要信息中编辑了一张插图。 - jeremiahbuddha
1
作为一种解决方法,您可以使用空格填充它们(前提是您正在使用等宽字体)。 - George Karpenkov
3个回答

30
你需要的后门是以下内容:

您要查找的后门如下:

# get the width of your widest label, since every label will need 
# to shift by this amount after we align to the right
shift = max([t.get_window_extent().width for t in legend.get_texts()])
for t in legend.get_texts():
    t.set_ha('right') # ha is alias for horizontalalignment
    t.set_position((shift,0))

4
喊一声!刚刚意识到你就是我在今年的PyCon上遇到的Paul,我们一起参加了IPython编程马拉松。我终于开始着手编写这个答案了,感谢你! - jeremiahbuddha
1
对我来说,这会导致“RuntimeError:无法获取渲染器的窗口范围”。编辑:好的,可以通过“renderer = fig.canvas.get_renderer()”进行修复,然后将渲染器传递给“get_window_extent()”。 - pfincent

27

我试着让这个例子工作,但是我失败了。

至少从matplotlib版本1.1.1开始(可能更早),我们需要一个专门的渲染实例。请注意您的后端定义了渲染器。根据后端不同,输出在屏幕上可能看起来很好,但在PDF上却很糟糕。

# get the width of your widest label, since every label will need 
#to shift by this amount after we align to the right
renderer = figure.canvas.get_renderer()
shift = max([t.get_window_extent(renderer).width for t in legend.get_texts()])
for t in legend.get_texts():
    t.set_ha('right') # ha is alias for horizontalalignment
    t.set_position((shift,0))

4

@Paul Ivanov的答案让我朝着正确方向前进了一步,但是对我来说需要稍作修改:

max_shift = max([t.get_window_extent().width for t in legend_obj.get_texts()])
for t in legend_obj.get_texts():
    t.set_ha('right')  # ha is alias for horizontalalignment
    temp_shift = max_shift - t.get_window_extent().width
    t.set_position((temp_shift, 0))

这个改变意味着我们根据物体的自身宽度和图例文本的最大宽度为每个对象设置不同的偏移量。
对于那些遇到“无法获取渲染器窗口大小”错误的人,请添加plt.pause(0.1) :)

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