同一轴上的多个传说

如果多次调用 plt.legend()ax.legend(),则会删除第一个图例并绘制一个新图例。根据官方文件

这样做是为了可以反复调用 legend() 来将图例更新为 Axes 上的最新句柄

但不要害怕:向轴添加第二个图例(或第三个或第四个……)仍然非常简单。在这里的示例中,我们绘制两条线,然后在它们各自的最大值和最小值上绘制标记。一个图例用于线条,另一个用于标记。

import matplotlib.pyplot as plt
import numpy as np

# Generate data for plotting:  
x = np.linspace(0,2*np.pi,100)
y0 = np.sin(x)
y1 = .9*np.sin(.9*x)
# Find their maxima and minima and store
maxes = np.empty((2,2))
mins = np.empty((2,2))
for k,y in enumerate([y0,y1]):
    maxloc = y.argmax()
    maxes[k] = x[maxloc], y[maxloc]
    minloc = y.argmin()
    mins[k] = x[minloc], y[minloc]

# Instantiate figure and plot
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y0, label='y0')
ax.plot(x,y1, label='y1')
# Plot maxima and minima, and keep references to the lines
maxline, = ax.plot(maxes[:,0], maxes[:,1], 'r^')
minline, = ax.plot(mins[:,0], mins[:,1], 'ko')

# Add first legend:  only labeled data is included
leg1 = ax.legend(loc='lower left')
# Add second legend for the maxes and mins.
# leg1 will be removed from figure
leg2 = ax.legend([maxline,minline],['max','min'], loc='upper right')
# Manually add the first legend back
ax.add_artist(leg1)

StackOverflow 文档

关键是要确保你有对图例对象的引用。当你添加第二个时,你实例化的第一个(leg1)将从图中删除,但 leg1 对象仍然存在,可以使用 ax.add_artist 添加回来。

真正伟大的是你仍然可以操作两个传说。例如,将以下内容添加到上面代码的底部:

leg1.get_lines()[0].set_lw(8)
leg2.get_texts()[1].set_color('b')

StackOverflow 文档

最后,值得一提的是,在示例中,只有线条在绘制时被赋予标签,这意味着 ax.legend() 仅将这些线条添加到 leg1。因此,标记(leg2)的图例在实例化时需要将行和标签作为参数。或者,我们可以在标记时给标记添加标记。但是这两个ax.legend 的调用都需要一些额外的参数,以便每个图例只包含我们想要的项目。