使用LaTeX数学公式的Matplotlib图例标签的垂直对齐

8
当混合带有下标的标签和没有下标的标签时,它们在图例中无法垂直对齐。由于matplotlib根据打印字符内部确定边界框,因此使用"vphantom"字符无法对齐这些图例标签,并且我尝试使用"set_va"来更改标签的垂直对齐方式,但没有成功。
以下是一个最小化工作示例,说明了我试图解决的问题。如果可能的话,我希望标签与文本基线对齐,否则与文本顶部对齐。
import numpy as np
import matplotlib as mpl
mpl.rcParams['text.usetex'] = True
import matplotlib.pyplot as plt

x = np.arange(10)
plt.plot(x, np.random.uniform(size=(10,)), c='red', label=r'test')
plt.scatter(x, np.random.uniform(size=(10,)), c='blue', label=r'test${}_{xy}$')
plt.legend(ncol=2)                                                                          
plt.show()

mwe image


1
你可以添加一张图片来说明问题吗? - DavidG
感谢您的建议,@DavidG,已经添加了。 - emprice
有趣的是,我无法重现这个问题。你使用的Python和matplotlib版本是什么? - DavidG
@DavidG,我正在使用Python 2.7.6和matplotlib 1.5.3。 - emprice
2个回答

10

text.latex.preview参数设置为True

import numpy as np
import matplotlib as mpl
mpl.rcParams['text.usetex'] = True
mpl.rcParams['text.latex.preview'] = True
import matplotlib.pyplot as plt

x = np.arange(10)
plt.plot(x, np.random.uniform(size=(10,)), c='red', label=r'test')
plt.scatter(x, np.random.uniform(size=(10,)), c='blue', label=r'test${}_{xy}$')
plt.legend(ncol=2)                                                      

plt.show()

基线对齐标签的图像

有关preview参数的效果,请参见此示例


1
注意:text.latex.preview在matplotlib 3.3.0中已被弃用;请参见此处获取更多详细信息。 - der_herr_g

2
你可以查看 Matplotlib图例中文本对齐
或者你也可以将第二个图例文本下移。
h_legend = plt.legend(ncol=2)
y_shift = -2.5
h_legend.texts[1].set_position((0, y_shift))

您可以使用类似以下代码的方式,根据图例窗口的范围来调整移动距离:

您可以使用类似以下代码的方式,根据图例窗口的范围来调整移动距离:

h_legend = plt.legend(ncol=2)    
renderer = plt.gcf().canvas.get_renderer()
y_shift = -0.2*h_legend.texts[0].get_window_extent(renderer).height
h_legend.texts[1].set_position((0, y_shift))

这将使第二个文本在图例窗口高度的20%处进行偏移。


感谢您的快速回复,@hashmuke。不过,我很好奇是否有一种自动移动标签的方法,因为我的实际用例有许多标签可能会随着时间而改变。 - emprice

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