同一軸上的多個傳說

如果多次呼叫 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 的呼叫都需要一些額外的引數,以便每個圖例只包含我們想要的專案。