子图中的Matplotlib图例

87

我希望能在下面每个小图中加入图例。我尝试使用plt.legend,但无效。

f, (ax1, ax2, ax3) = plt.subplots(3, sharex=True, sharey=True)
ax1.plot(xtr, color='r', label='Blue stars')
ax2.plot(ytr, color='g')
ax3.plot(ztr, color='b')
ax1.set_title('2012/09/15')
plt.legend([ax1, ax2, ax3],["HHZ 1", "HHN", "HHE"])
plt.show()

生成的图表 根据atomh33ls的建议:

ax1.legend("HHZ 1",loc="upper right")
ax2.legend("HHN",loc="upper right")
ax3.legend("HHE",loc="upper right")

图例位置固定,但似乎存在字符串问题,因为每个字母都被放在新的一行中。

有人知道如何解决吗?

enter image description here


关于字符串问题:尝试在plot()命令中使用label关键字。 - user707650
当字符串变成它们的单个字母时,这是因为Python将字符串视为字母序列。如果您需要告诉Python一个字符串是不应该被分解的字符串,您可以将其放入一个元素列表["HHZ"]或元组("HHZ",)中。 - Teepeemm
3个回答

116

这应该可以工作:

ax1.plot(xtr, color='r', label='HHZ 1')
ax1.legend(loc="upper right")
ax2.plot(xtr, color='r', label='HHN')
ax2.legend(loc="upper right")
ax3.plot(xtr, color='r', label='HHE')
ax3.legend(loc="upper right")

2
是的,它将图例放在了正确的位置。谢谢!唯一的问题是,它将每个字母都放在了一行。你知道如何避免这种情况吗? - CatarinaCM
在这里你可以找到更多细节:https://matplotlib.org/stable/tutorials/intermediate/legend_guide.html - Loich

32

您想要的无法实现,因为plt.legend()会将图例放置在当前坐标轴中,在您的情况下是在最后一个坐标轴中。

另一方面,如果您可以在最后一个子图中放置一个全面性的图例,您可以按照以下方式操作。

f, (ax1, ax2, ax3) = plt.subplots(3, sharex=True, sharey=True)
l1,=ax1.plot(x,y, color='r', label='Blue stars')
l2,=ax2.plot(x,y, color='g')
l3,=ax3.plot(x,y, color='b')
ax1.set_title('2012/09/15')
plt.legend([l1, l2, l3],["HHZ 1", "HHN", "HHE"])
plt.show()

在此输入图片描述

请注意,与您的示例代码中传递轴不同,将legend传递的是由plot调用返回的行。

PS

当然,您可以在每个子图后面调用legend,但在我看来,您已经知道了这一点,并且正在寻找一种同时完成此操作的方法。


1
抱歉打扰一下,我可以确认一下使图例位置在最后一个图表的关键是 sharex = Truesharey = True 吗? - user7986928
你如何将这个全面的图例放在图形底部? - ifly6
@user7986928 不行 - undefined

8

这个做了你想要的事情,并且克服了其他答案中存在的一些问题:

import matplotlib.pyplot as plt

labels = ["HHZ 1", "HHN", "HHE"]
colors = ["r","g","b"]

f,axs = plt.subplots(3, sharex=True, sharey=True)

# ---- loop over axes ----
for i,ax in enumerate(axs):
  axs[i].plot([0,1],[1,0],color=colors[i],label=labels[i])
  axs[i].legend(loc="upper right")

plt.show()

... 生成 ... 子图


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