[Python3] Matplotlib —— (七) 配置圖例


[ 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數據科學手冊》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章