[ Matplotlib version: 3.2.1 ]
九、配置顏色條
圖例通過離散的標籤標示離散的圖形元素,然而,對於圖形中由彩色的點、線、面構成的連續標籤,用顏色條來表示的效果比較好。
在Matplotlib中,顏色條是一條獨立的座標軸,可以指明圖形中顏色的含義。
通過colorbar()
函數可以創建最簡單的顏色條
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('classic')
%matplotlib inline
# 簡易顏色條圖例
x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])
plt.imshow(I)
plt.colorbar()
可以通過cmap
參數爲圖形設置顏色條的配色方案
plt.cm.<Tab>
查看所有可用配色方案
plt.imshow(I, cmap='gray')
(一)選擇配色方案
一般情況下,只需要重點關注三種不同的配色方案:
- 順序配色方案:由一組連續的顏色構成的配色方案(如
binary
或viridis
) - 互逆配色方案:通常由兩種互補的顏色構成,表示正反兩種含義(如
RdBu
或PuOr
) - 定性配色方案:隨機順序的一組顏色(如
rainbow
或jet
)
jet
配色方案與非等差的漸變亮度
–jet
是一種定性配色方案,曾是Matplotlib 2.0之前所有版本的默認配色方案
– 缺點:定性配色方案在對定性數據進行可視化時的選擇空間非常有限。隨着圖形亮度的提高,經常會出現顏色無法區分的問題
– 灰度圖裏比較亮的部分條紋:這些亮度變化不均勻的條紋在彩色圖中對應某一段彩色區間,由於色彩太接近容易凸顯出數據集中不重要的部分,導致眼睛無法識別重點
from matplotlib.colors import LinearSegmentedColormap
def grayscale_cmap(cmap):
"""爲配色方案顯示灰度圖"""
cmap = plt.cm.get_cmap(cmap)
colors = cmap(np.arange(cmap.N))
# 將RGBA色轉換爲不同亮度的灰度值
RGB_weight = [0.299, 0.587, 0.114]
luminance = np.sqrt(np.dot(colors[:, :3] ** 2, RGB_weight))
colors[:, :3] = luminance[:, np.newaxis]
return LinearSegmentedColormap.from_list(cmap.name + '_gray', colors, cmap.N)
def view_colormap(cmap):
"""用等價的灰度圖表示配色方案"""
cmap = plt.cm.get_cmap(cmap)
colors = cmap(np.arange(cmap.N))
cmap = grayscale_cmap(cmap)
grayscale = cmap(np.arange(cmap.N))
fig, ax = plt.subplots(2, figsize=(6, 2),
subplot_kw=dict(xticks=[], yticks=[]))
ax[0].imshow([colors], extent=[0, 10, 0, 1])
ax[1].imshow([grayscale], extent=[0, 10, 0, 1])
view_colormap('jet')
- 更好的配色方案
viridis
(Matplotlib 2.0默認配色方案)
– 採用的亮度漸變方式,不僅便於視覺觀察,而且轉換成灰度圖後也更清晰
# viridis配色方案和漸變亮度scale
view_colormap('viridis')
- 彩虹效果的配色方案
cubehelix
# cubehelix配色方案和漸變亮度
view_colormap('cubehelix')
- 如果要用兩種顏色表示正反兩種含義時,可以使用
RdBu
雙色配色方案(紅色-藍色,Red-Blue簡稱)
– 缺點:用紅色、藍色表示的正反兩種信息在灰度圖上看不出差別
# RdBu配色方案和漸變亮度
view_colormap('RdBu')
(二)顏色條刻度的限制與擴展功能的設置
設置顏色條擴展屬性
- 可以將顏色條本身僅看作是一個
plt.Axes
實例,因此所有關於座標軸和刻度值的格式配置技巧均可用 - 顏色條有一些有趣的特性:如,可以縮短顏色取值上下限,對於超出上下限的數據通過
extend
參數用三角箭頭表示比上限大的數或比下限小的數
# 爲圖形像素設置1%噪點
speckles = (np.random.random(I.shape) < 0.01)
I[speckles] = np.random.normal(0, 3, np.count_nonzero(speckles))
plt.figure(figsize=(10, 3.5))
plt.subplot(1, 2, 1)
plt.imshow(I, cmap='RdBu')
plt.colorbar()
plt.subplot(1, 2, 2)
plt.imshow(I, cmap='RdBu')
plt.colorbar(extend='both')
plt.clim(-1, 1)
- 左圖是用默認的顏色條刻度限制實現的效果,噪點的範圍完全覆蓋了我們感興趣的數據
- 而右圖設置了顏色條的刻度上下限,並在上下限之外增加了擴展功能,這樣的數據可視化圖形更有效果
(三)離散型顏色條
雖然顏色條默認都是連續的,但有時也需要表示離散數據。
使用plt.cm.get_cmap()
函數,將適當的配色方案的名稱以及需要的區間數量傳進去即可
plt.imshow(I, cmap=plt.cm.get_cmap('Blues', 6))
plt.colorbar()
plt.clim(-1, 1)
Matplotlib 相關閱讀:
[Python3] Matplotlib —— (一) 入門基礎
[Python3] Matplotlib —— (二) 簡易線形圖
[Python3] Matplotlib —— (三) 簡易散點圖
[Python3] Matplotlib —— (四) 可視化異常處理
[Python3] Matplotlib —— (五) 密度圖與等高線圖
[Python3] Matplotlib —— (六) 頻次直方圖、數據區間劃分和分佈密度
[Python3] Matplotlib —— (七) 配置圖例
總結自《Python數據科學手冊》