Matplotlib顏色條配置
- 基本顏色
- 顏色條
- 選擇配色方案
- 顏色條刻度的限制與擴展功能的設置
- 離散型顏色條
基本顏色
Matplotlib
提供了8種指定顏色的方法:
-
在[0,1]中的浮點值的RGB或RGBA元組(例如 (0.1, 0.2, 0.5) 或(0.1, 0.2, 0.5, 0.3))。RGBA是紅色,綠色,藍色,Alpha的縮寫;
-
十六進制RGB或RGBA字符串(例如: #0F0F0F 或者 #0F0F0F0F);
-
[0, 1]中浮點值的字符串表示,包括灰度級(例如,0.5);
-
單字母字符串,例如這些其中之一:{b, g,r, c,m, y, k, w};
-
一個 X11/CSS4(html)顏色名稱,例如:blue;
-
來自xkcd的顏色調研的名稱,前綴為 xkcd:(例如:xkcd:sky blue);
-
一個 Cn 顏色規范,即C 后跟一個數字,這是默認屬性循環的索引(matplotlib.rcParams[axes.prop_cycle]); 索引在藝術家對象創建時發生,如果循環不包括顏色,則默認為黑色;
-
其中一個 {tab:blue,tab:orange,tab:green,tab:red, tab:purple,tab:brown,tab:pink,tab:gray,tab:olive, tab:cyan},它們是tab10分類調色板中的Tableau顏色(這是默認的顏色循環)。
代碼示例:
t = np.linspace(0.0, 2.0, 201)
s = np.sin(2 * np.pi * t)
fig, ax = plt.subplots(facecolor=(.18, .31, .31))#RGB 元組
ax.set_facecolor('#eafff5')#hex字符串
ax.set_title('Voltage vs. time chart', color='0.7')#灰度字符串
ax.plot(t, s, 'xkcd:crimson')
ax.plot(t, .7*s, color='C4', linestyle='--')#CN顏色選擇
ax.tick_params(labelcolor='tab:orange')
效果圖
顏色條
顏色的設置應該是在matploblib
使用最頻繁的配置之一了。matplotlib
通過cmap
參數為圖形設置顏色條的配色方案:
x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])
plt.imshow(I, cmap='gray')#采用灰度配色的圖形
效果圖
matplotlib
所有可用的配色方案都在plt.cm
命名空間中。在jupyter
里通過Tab鍵就可以查看所有的配置方案:plt.cm<TAB>
選擇配色方案
有了這么多能夠選擇的配色方案只是第一步,重要的是如何確定用那種方案。一般情況下我們只需要關注三種不同的配色方案:
-
順序配色方案,由一組連續的顏色構成的配色方案(例如
binary
或viridis
); -
互逆配色方案,通常由兩種互補的顏色構成,表示正反兩種含義(例如
RdBu
或PuOr
); -
定性配色方案,隨機順序的一組顏色(例如
rainbow
或jet
)。
jet
是一種定性配色方案,定性配色方案在對定性數據進行可視化時的選擇空間非常有限。隨著圖形亮度的提高,經常會出現顏色無法區分的問題。接下來將演示幾個常用的配色方案。
這里通過把jet
轉換為黑白的灰度圖看看:
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.pyplot as plt
import numpy as np
def grayscale_cmap(cmap):"""為配色方案顯示灰度圖"""cmap = plt.cm.get_cmap(cmap)colors = cmap(np.arange(cmap.N))# 將RGBA色轉換為不同亮度的灰度值# 參考鏈接http://alienryderflex.com/hsp.htmlRGB_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')
plt.show()
效果圖
從上圖我們觀察灰度圖里比較亮的那部分條紋。這些亮度變化不均勻的條紋在彩色圖中對應某一段彩色區間,由于色彩太接近容易突顯出數據集中不重要的部分,導致眼睛無法識別重點。更好的配色方案是viridis
,它采用了精心設計的亮度漸變方式,這樣不僅便于視覺觀察,而且更清晰:
view_colormap('viridis')
還可以使用cubehelix實現彩虹效果,cubehelix配色方案可以可視化連續的數值:
view_colormap('cubehelix')
還有一種可以用兩種顏色表示正反兩種含義的方案,實現函數為RdBu:
view_colormap('RdBu')
顏色條刻度的限制與擴展功能的設置
Matplotlib
提供了豐富的顏色條配置功能。由于可以將顏色條本身僅看作是一個plt.Axes
實例,因此前面所學的所有關于坐標軸和刻度值的格式配置技巧都可以派上用場。顏色條有一些有趣的特性。
例如,我們可以縮短顏色取值的上下限,對于超出上下限的數據,通過extend參數用三角箭頭表示比上限大的數或者比下限小的數。下面展示一張噪點圖:
x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])
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()
函數,將適當的配色方案的名稱以及需要的區間數量傳進去即可:
x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])
plt.imshow(I, cmap=plt.cm.get_cmap('Blues', 6))
plt.colorbar()
plt.clim(-1, 1);
效果圖