[ Matplotlib version: 3.2.1 ]
八、配置圖例
在可視化圖形中使用圖例,可以爲不同的圖形元素分配標籤。
本文介紹如何在Matplotlib中自定義圖例的位置與藝術風格。
圖例默認配置
可以用plt.legend()
命令來創建最簡單的圖例,它會自動創建一個包含每個圖形元素的圖例
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('classic')
%matplotlib inline
x = np.linspace(0, 10, 1000)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), '-b', label='Sine')
ax.plot(x, np.cos(x), '--r', label='Cosine')
ax.axis('equal')
leg = ax.legend()
自定義圖例
- 設置圖例位置
loc
- 是否有外邊框
frameon
- 設置圖例標籤列數
ncol
- 圖例定義圓角邊框
fancybox
- 增加陰影
shadow
- 改變外邊框透明度
framealpha
- 改變文字間距
borderpad
ax.legend(loc='upper left', frameon=False)
fig
ax.legend(frameon=False, loc='lower center', ncol=2)
fig
ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1)
fig
(一)選擇圖例顯示的元素
圖例會默認顯示所有元素的標籤。如果不想顯示全部,可以通過一些圖形命令來指定顯示圖例中的哪些元素和標籤。
plt.plot()
可以一次創建多條線,返回線條實例列表
- 一種方法是將需要顯示的線條傳入
plt.legend()
- 另一種方法是隻爲需要在圖例中顯示的線條設置標籤
- 注意:默認情況下圖例會忽略不帶標籤的元素
# 方法一
y = np.sin(x[:, np.newaxis] + np.pi * np.arange(0, 2, 0.5))
lines = plt.plot(x, y)
# lines變量是一組plt.Line2D實例
plt.legend(lines[:2], ['first', 'second'])
# 方法二
plt.plot(x, y[:, 0], label='first')
plt.plot(x, y[:, 1], label='second')
plt.plot(x, y[:, 2:])
plt.legend(framealpha=1, frameon=True)
(二)在圖例中顯示不同尺寸的點
用不同尺寸的點來表示數據的特徵
# 美國加州個城市的地理位置、面積和人口數量
# 目的:創建一個通過不同尺寸的點顯示不同人口數量級的圖例(隱藏無關數據標籤)
import pandas as pd
cities = pd.read_csv('./data/california_cities.csv')
# 提取數據
lat, lon = cities['latd'], cities['longd']
population, area = cities['population_total'], cities['area_total_km2']
# 用不同尺寸和顏色的散點圖表示數據,但不帶標籤
plt.scatter(lon, lat, label=None,
c=np.log10(population), cmap='viridis',
s=area, linewidth=0, alpha=0.5)
plt.axis(aspect='equal')
plt.xlabel('longitude')
plt.ylabel('latitude')
plt.colorbar(label='log$_{10}$(population)')
plt.clim(3, 7)
# 創建圖例
# 畫一些帶標籤和尺寸的空列表
for area in [100, 300, 500]:
plt.scatter([], [], c='k', alpha=0.3, s=area,
label=str(area) + ' km$^2$')
plt.legend(scatterpoints=1, frameon=False,
labelspacing=1, title='City Area')
plt.title('California Cities: Area and Population')
- 圖例通常是圖形中對象的參照,如果想顯示某種形狀就需要將它畫出來。但是示例中,對象(灰色圓圈)並不在圖形中,因此把它們用空列表假裝畫出來(圖例只會顯示帶標籤元素)
- 爲了畫出這些空列表中的圖形元素,需要爲它們設置標籤,以便圖例可以顯示,這樣就可以從圖例中獲取信息了(這個策略對於創建複雜可視化圖形很有效)
- 在處理這類地理數據時,如果能把州的地理邊界或其他地圖元素也顯示出來,圖形會更加逼真(Matplotlib的Basemap(底圖)插件工具箱可以實現)
(三)同時顯示多個圖例
在同一張圖上顯示多個圖例
- 用Matplotlib解決這個問題並不同意,因爲通過標準的
legend
接口只能爲一張圖創建一個圖例,如果用plt.legend()
或ax.legend()
方法創建第二個圖例,那麼第一個圖例就會被覆蓋 - 可以通過從頭開始創建一個新圖例藝術家對象(legend artist)然後用底層(lower-level)的
ax.add_artist()
方法在圖上添加第二個圖例
# 帶雙圖例的曲線圖
from matplotlib.legend import Legend
fig, ax = plt.subplots()
lines = []
styles = ['-', '--', '-.', ':']
x = np.linspace(0, 10, 1000)
for i in range(4):
lines += ax.plot(x, np.sin(x-i*np.pi/2),
styles[i], color='black')
ax.axis('equal')
# 設置第一個圖例要顯示的線條和標籤
ax.legend(lines[:2], ['line A', 'line B'],
loc='upper right', frameon=False)
# 創建第二個圖例,通過add_artist方法添加到圖上
leg = Legend(ax, lines[2:], ['line C', 'line D'],
loc='lower right', frameon=False)
ax.add_artist(leg)
Matplotlib 相關閱讀:
[Python3] Matplotlib —— (一) 入門基礎
[Python3] Matplotlib —— (二) 簡易線形圖
[Python3] Matplotlib —— (三) 簡易散點圖
[Python3] Matplotlib —— (四) 可視化異常處理
[Python3] Matplotlib —— (五) 密度圖與等高線圖
[Python3] Matplotlib —— (六) 頻次直方圖、數據區間劃分和分佈密度
總結自《Python數據科學手冊》