[Python3] Matplotlib —— (八) 配置顏色條


[ 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')

在這裏插入圖片描述

(一)選擇配色方案

一般情況下,只需要重點關注三種不同的配色方案:

  • 順序配色方案:由一組連續的顏色構成的配色方案(如binaryviridis
  • 互逆配色方案:通常由兩種互補的顏色構成,表示正反兩種含義(如RdBuPuOr
  • 定性配色方案:隨機順序的一組顏色(如rainbowjet
  1. 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')

在這裏插入圖片描述

  1. 更好的配色方案viridis(Matplotlib 2.0默認配色方案)
    – 採用的亮度漸變方式,不僅便於視覺觀察,而且轉換成灰度圖後也更清晰
# viridis配色方案和漸變亮度scale
view_colormap('viridis')

在這裏插入圖片描述

  1. 彩虹效果的配色方案cubehelix
# cubehelix配色方案和漸變亮度
view_colormap('cubehelix')

在這裏插入圖片描述

  1. 如果要用兩種顏色表示正反兩種含義時,可以使用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數據科學手冊》

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