同一轴上的多个传说
如果多次调用 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)
关键是要确保你有对图例对象的引用。当你添加第二个时,你实例化的第一个(leg1
)将从图中删除,但 leg1
对象仍然存在,可以使用 ax.add_artist
添加回来。
真正伟大的是你仍然可以操作两个传说。例如,将以下内容添加到上面代码的底部:
leg1.get_lines()[0].set_lw(8)
leg2.get_texts()[1].set_color('b')
最后,值得一提的是,在示例中,只有线条在绘制时被赋予标签,这意味着 ax.legend()
仅将这些线条添加到 leg1
。因此,标记(leg2
)的图例在实例化时需要将行和标签作为参数。或者,我们可以在标记时给标记添加标记。但是这两个对 ax.legend
的调用都需要一些额外的参数,以便每个图例只包含我们想要的项目。