以下代码产生下图:
import numpy as np
import matplotlib.pyplot as plt
xs = np.random.rand(100)
ys = np.random.rand(100)
r, p = 0.930, 1e-5
label = '$T_m$\n$\\rho = %.3f, p = %.1e$'%(r, p)
fig, ax = plt.subplots()
ax.scatter(xs, ys, label=label)
ax.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

我希望图例文本居中,即'$T_m$'在第一行居中。我尝试过使用str.format迷你语言来处理各种事情,例如
label = '{0:{x}^25}\n{1:.3f}, {2:.1e}'.format('$T_m$', r, p, x=' ')
Run Code Online (Sandbox Code Playgroud)
我认为这会起作用,因为以下给出
>>> print ax.get_legend_handles_labels()
([<matplotlib.collections.PathCollection object at 0x7fa099286590>],
[u' $\\Delta T_{m}$ \n$\\rho=0.930, p=1.2 \\times 10^{-5}$'])
Run Code Online (Sandbox Code Playgroud)
但标签中的空白被删除。我不能使用任何乳胶空格('\;'或'\\mbox{}')作为填充字符,因为它们是多个字符。我还尝试在各个地方使用multialignment='center'关键字,但它不是有效的 kwarg ax.legend。
如何在图例文本中获得居中的多行对齐方式? 最终,我将使用几个图例句柄,其中标签文本可以在第二行中包含更多字符(如此处所示)或在第一行中包含更多字符(与此处所示相反)。
我正在使用 python 2.7.6 和 matplotlib 1.4.3。
正如您自己所发现的那样,关键是multialignment论证。然而,它不是函数的参数,而仅仅是Text Atristslegend的属性。因此,诀窍是保存图例的句柄,然后为每个文本元素设置此属性:
leg = ax.legend()
for t in leg.texts:
t.set_multialignment('center')
Run Code Online (Sandbox Code Playgroud)
结果:
