加入顏色對照表 ( colorbar )
使用 matplotlib 繪製圖表時,常常會將資料點上色,進行不同顏色的區隔,當資料點具有漸層色彩後,可以加入「顏色對照表 colorbar」,讓整體資料更容易觀察,這篇教學將會介紹如何加入顏色對照表 colorbar。
快速導覽
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
什麼是 colorbar?
colorbar ( 顏色對照表 ) 是一個輔助圖表的對照表,顯示在帶有漸層色彩的圖表旁邊,提醒使用者圖表內顏色所代表的意義。
加入 colorbar
如果只是要加入 colorbar,只需要在繪製圖表的後方,加上 colorbar() 的方法,就可以在圖表上加入 colorbar,下方的程式碼執行後,會在散布圖的右側加上 colorbar,顏色使用 PiYG 的 colormap。
import matplotlib.pyplot as plt
x = [1,2,3,4,5,6,7,8,9,10]
y = [11,8,26,16,9,17,23,4,14,10]
plt.scatter(x, y, c=y, cmap='PiYG') # 繪製散布圖,顏色使用 PiYG 的 colormap
plt.colorbar() # 加入 colorbar
plt.show()
下方的例子使用 NumPy 產生每組 50 個 100~2000 隨機數字 y 和 size,使用 matplotlib 繪製出散布圖,並加入 colorbar。
參考:random.randint()。
import matplotlib.pyplot as plt
from numpy import random
x = range(0,50)
y = random.randint(100,2000,size=50)
s = random.randint(10,500,size=50)
plt.scatter(x, y, s=s, c=s, cmap='Reds')
plt.colorbar()
plt.show()
多個子圖表的 colorbar
colorbar() 有下列幾個常用的參數,設定參數後,就能將 colorbar 套用在不同的子圖表 ( 完整參數參考:matplotlib.pyplot.colorbar )。
參數 | 說明 |
---|---|
mappable | 指定的子圖表。 |
ax | 對應指定的子圖表座標系統。 |
orientation | 預設 vertical 垂直,可設定 horizontal 水平。 |
pad | 離圖表的間距,預設垂直 0.05,水平 0.15。 |
下方的程式碼,先定義 a1 和 a2 變數為兩張子圖表,添加 colorbar 時,將 mappable 指定為 a1 和 a2,ax 指定為該子圖表的座標系統,就能夠在指定的子圖表內,加上 colorbar。
import matplotlib.pyplot as plt
from numpy import random
x = range(0,50)
y = random.randint(100,2000,size=50)
s = random.randint(10,500,size=50)
fig, ax = plt.subplots(1,2)
a1 = ax[0].scatter(x, y, s=s, c=s, cmap='Reds')
a2 = ax[1].scatter(x, y, s=s, c=s, cmap='Blues')
plt.colorbar(a1,ax=ax[0])
plt.colorbar(a2,ax=ax[1],orientation='horizontal',pad=0.1) # 調整參數,改成水平 colorbar
plt.tight_layout()
plt.show()
下方的程式碼,會將前兩個子圖表共用一個 colorbar。
import matplotlib.pyplot as plt
from numpy import random
x = range(0,50)
y = random.randint(100,2000,size=50)
s = random.randint(100,2000,size=50)
fig, ax = plt.subplots(3,1)
a1 = ax[0].scatter(x, y, s=s, c=s, cmap='Reds')
a2 = ax[1].scatter(x, y, s=s, c=s, cmap='Reds')
a3 = ax[2].scatter(x, y, s=s, c=s, cmap='Blues')
plt.colorbar(a1,ax=[ax[0],ax[1]]) # ax 設定為串列,就能共用一個 colorbar
plt.colorbar(a3,ax=ax[2])
#cbar3.ax.tick_params(labelsize=18, labelcolor='#00c', direction='in', size=20, width=5, length=1)
#plt.tight_layout()
plt.show()
設定 colorbar 屬性樣式
透過調整 colorbar 的屬性,能夠設定 colorbar 的樣式,常用的樣式屬性如下:
屬性 | 說明 |
---|---|
extend | 首尾是否為延伸出去的「尖端」,預設 neither 表示不延伸 ( 兩端都是「方形」),可設定 both、min、max。 |
extendfrac | 如果 extend 設為尖端,則可設定尖端的長度,預設 0.05。 |
extendrect | 設定延伸出去不是尖端,而是方形。 |
ticks | colorbar 的顯示標籤文字,預設 None 自動產生,使用串列格式。 |
boundaries | 是否使用索引色模式 ( 非平滑漸層 ),使用串列格式。 |
drawedges | 是否在顏色邊界處畫線,預設 False 不畫線,設定 True 會畫線。 |
label | colorbar 的說明文字標籤。 |
下方的程式碼執行後,會透過 colorbar 的屬性,改變藍色的圖表的 colorbar 樣式。
import matplotlib.pyplot as plt
from numpy import random
x = range(0,50)
r = range(0,2200,200)
y = random.randint(100,2000,size=50)
s = random.randint(100,2000,size=50)
fig, ax = plt.subplots(1,2)
fig.set_size_inches(10,5)
a1 = ax[0].scatter(x, y, s=s, c=s, cmap='Reds')
a2 = ax[1].scatter(x, y, s=s, c=s, cmap='Blues')
cbar1 = plt.colorbar(a1,ax=ax[0])
cbar2 = plt.colorbar(a2,ax=ax[1],
boundaries=r,
ticks=r,
label='test',
extend='both')
plt.tight_layout()
plt.show()
調整 colorbar 標籤樣式
colorbar() 本身的參數無法調整文字標籤樣式,因此必須透過 ax.tick_params() 的方法進行設定,常用的參數設定如下:
參數 | 說明 |
---|---|
labelsize | 標籤文字大小。 |
labelcolor | 標籤文字顏色。 |
direction | 標籤線段位置,預設 out,可設定 in 或 inout。| |
width | 標籤線段粗細,預設 1。 |
size | 標籤線段長度, |
下方的程式碼執行後,會透過 ax.tick_params(),改變藍色的圖表的 colorbar 的標籤樣式。
import matplotlib.pyplot as plt
from numpy import random
x = range(0,50)
y = random.randint(100,2000,size=50)
s = random.randint(10,500,size=50)
fig, ax = plt.subplots(1,2)
fig.set_size_inches(10,5)
a1 = ax[0].scatter(x, y, s=s, c=s, cmap='Reds')
a2 = ax[1].scatter(x, y, s=s, c=s, cmap='Blues')
cbar1 = plt.colorbar(a1,ax=ax[0])
cbar2 = plt.colorbar(a2,ax=ax[1])
cbar2.ax.tick_params(labelsize=18, labelcolor='#00c', direction='in', size=10, width=5)
plt.tight_layout()
plt.show()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~