matplotlib中的多线传奇

时间:2017-12-11 20:22:31

标签: python matplotlib legend

enter image description here我有4个项目的传奇。我把它们分成两行两列。每个图例条目的标签长度​​差异很大。如何将图例的每一行居中?目前我正在使用:

plt.legend(legend,labels,bbox_to_anchor=(-0.0, 1.22, 1.0, 0), mode="expand", scatterpoints=1)

从图中可以看出,图例的行是对齐的,因此符号在彼此的顶部。如何使行居中以使每行在图x轴上居中?

1 个答案:

答案 0 :(得分:2)

图例是基于列的;每列的宽度由最长的标签决定。我猜想有可能重写传奇代码,使其基于行并切断使用HPacker。但我不确定这是否值得付出努力。或者,您可以创建几个图例,每行一个并将它们放在彼此的顶部;在没有图例框架的情况下使用(frameon=False)。

要创建两个图例,您需要在创建第二个图例后手动将第一个添加到轴。传说的位置将是例如是loc="lower center", bbox_to_anchor=(0.5, yi),其中yi是垂直位置,对于简单的情况,可以通过反复试验找到。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(3)

markers = ["o","s","d","^"]
labels = ["Total", "Very very very long label", "Component 1", "Component 3"]
fig, ax = plt.subplots()

for i in range(4):
    ax.plot(x,i*(x+1), marker=markers[i], label=labels[i])

h, l = ax.get_legend_handles_labels()
kw = dict(ncol=2, loc="lower center", frameon=False)    
leg1 = ax.legend(h[:2],l[:2], bbox_to_anchor=[0.5,1.08],**kw)
leg2 = ax.legend(h[2:],l[2:], bbox_to_anchor=[0.5,1.00],**kw)
ax.add_artist(leg1)

fig.subplots_adjust(top=0.8)

plt.show()

enter image description here