legend的用法

2023-08-31 06:00:19

常規使用legend的方法

1. 自動檢測

設定titlelabel標籤,隨後使用不帶引數的legend函數也會自動顯示(但不限於一種方式設定圖形的label,只要設定了圖形的label,使用legend函數會自動顯示圖例)

import matplotlib as mlp 
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 2, 3], label='y = x')
ax.legend(loc='upper left', fontsize='large', title='linear function')
plt.show()

另一種方式(設定某個物件的label屬性,可以是各種物件)

import matplotlib as mlp 
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
# 必須得加逗號,不然line就是一個列表了
line, = ax.plot([1, 2, 3], [1, 2, 3])
# 結果是<class 'matplotlib.lines.Line2D'>
print(type(line)) 
# 設定途中的線條標籤
line.set_label('y = x')
ax.legend(loc='upper left', fontsize='large', title='linear function')
plt.show()

  • 特別注意

通過在標籤以下劃線 - 開頭的物件上使用標籤,可以從自動圖例元素選擇中排除特定的圖表元素。以下劃線開頭的字串是所有圖表元素的預設標籤,因此如果在沒有任何引數的情況下呼叫Axes.legend且沒有手動設定標籤,將不會繪製圖例。例子如下:

import matplotlib as mlp 
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
# 必須得加逗號,不然line就是一個列表了
line, = ax.plot([1, 2, 3], [1, 2, 3])
# 結果是<class 'matplotlib.lines.Line2D'>
print(type(line)) 
# 設定途中的線條標籤
line.set_label('_y = x')
ax.legend(loc='upper left', fontsize='large', title='linear function')
plt.show()


2. 明確列出圖例中的圖表元素和標籤

要完全控制哪些圖表元素具有圖例條目,可以分別傳遞一個圖表元素的可迭代物件和一個圖例標籤的可迭代物件,例子如下:

  • 繪製sin,cos,線性函數三條曲線,並以明確列出圖例中的圖表元素和標籤設定圖例
import matplotlib as mlp 
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
x = np.linspace(0, 10, 10000)
y = np.sin(x)
z = np.cos(x)
w = 0.01 * x
# 必須得加逗號,不然line就是一個列表了
sin_curve, = ax.plot(x, y, color='red', linewidth=2)
cos_curve, = ax.plot(x, z, color='blue', linewidth=2)
line, = ax.plot(x, w,color='green', linewidth=2)

ax.legend([sin_curve, cos_curve, line], ['y = sin(x)', 'z = cos(x)', 'w = 0.01 * x'], title= 'some function')
plt.show()

另一種方法

import matplotlib as mlp 
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
x = np.linspace(0, 10, 10000)
y = np.sin(x)
z = np.cos(x)
w = 0.01 * x
# 必須得加逗號,不然line就是一個列表了
sin_curve, = ax.plot(x, y, color='red', linewidth=2, label = 'sin')
cos_curve, = ax.plot(x, z, color='blue', linewidth=2, label = 'cos')
line, = ax.plot(x, w,color='green', linewidth=2, label = 'line')

ax.legend(handles = [sin_curve, cos_curve, line],  title= 'some function')
plt.show()

3. 容易造成混亂的一種寫法

這種呼叫方式不被推薦,因為繪圖元素與標籤之間的關係只能通過它們的順序隱式地確定,很容易混淆。要為一個Axes上的所有圖表元素建立圖例,請使用一個字串的可迭代物件,每個字串對應一個圖例項。例如(下面是錯誤的範例):

import matplotlib as mlp 
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
x = np.linspace(0, 10, 10000)
y = np.sin(x)
z = np.cos(x)
w = 0.01 * x
# 必須得加逗號,不然line就是一個列表了
sin_curve, = ax.plot(x, y, color='red', linewidth=2)
cos_curve, = ax.plot(x, z, color='blue', linewidth=2)
line, = ax.plot(x, w,color='green', linewidth=2)

# # 建立圖例,使用字串對應繪圖元素的順序,一定要對應,否則很容易出錯
ax.legend(['sin', 'line', 'cos'],  title= 'some function')
plt.show()

legend其他引數的設定

1. 位置設定

圖例的位置可以通過 loc 引數進行設定。以下是一些常用的位置選項:
'upper left', 'upper right', 'lower left', 'lower right':將圖例放置在對應角落。
'upper center', 'lower center', 'center left', 'center right':將圖例放置在對應邊的中心。'center':將圖例放置在座標軸中心。'best':在已定義的九個位置中,選擇與其他元素重疊最小的位置。注意,對於大量資料的圖表,此選項可能會降低繪圖速度。

2. 圖例盒子定位

除了位置,可以使用 bbox_to_anchor 引數來定點陣圖例。以下是一些常見用法:
使用4元組 (x, y, width, height) 指定圖例的盒子位置和大小。
使用2元組 (x, y) 指定圖例的角落位置,以 loc 為基準。

3. 列數設定

如果圖例中的條目過多,可以通過設定 ncols 引數來控制圖例的列數,以便更好地排列條目。

4. 字型和標籤顏色

可以使用 prop 引數來設定圖例的字型屬性。同時,通過 labelcolor 引數,可以調整標籤的顏色,使其與線條或標記的顏色匹配。

5. 標記數量和大小

numpoints 引數設定圖例中標記的數量。
scatterpoints 引數設定散點圖圖例中標記的數量。
scatteryoffsets 引數設定散點圖示記的垂直偏移。

6. 圖例背景和邊框

可以通過以下引數設定圖例的背景和邊框樣式:
frameon:是否繪製圖例的邊框。
fancybox:是否啟用圓角邊框。
shadow:是否在圖例後面繪製陰影。

7. 對齊和標題

alignment:設定圖例標題和條目框的對齊方式。
title:設定圖例的標題。

8. 圖例項順序和拖動

reverse:設定是否反轉圖例條目順序。
draggable:設定是否允許通過滑鼠拖動圖例。

9. 其他細節引數

此外,還有一些其他引數可以進一步細化圖例的外觀,如邊距、間距以及標記的長度和高度等。具體可以查官方檔案:
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html