使用 Python Matplotlib 自定義顏色圖

Aditya Raj 2023年1月30日
  1. 在 Python 中使用 Matplotlib 建立自定義顏色圖
  2. 在 Python 中使用 Matplotlib 的 get_cmap() 方法訪問顏色圖及其值
  3. 在 Python 中使用 ListedColormap 物件的 colors 屬性建立自定義列出的顏色圖
  4. 在 Python 中如何建立自定義線性分段顏色圖
  5. まとめ
使用 Python Matplotlib 自定義顏色圖

顏色圖是顯示圖形中連續值和離散值之間變化的最有效方法之一。本文將討論在 Python 中使用 Matplotlib 建立自定義顏色圖。

在 Python 中使用 Matplotlib 建立自定義顏色圖

matplotlib 庫提供各種內建顏色圖。但是,假設你想要操作顏色圖或建立自定義顏色圖。在這種情況下,你可以使用 matplotlib 庫中定義的 ListedColormap 類或 LinearSegmentedColormap 類來完成。

在建立自定義顏色圖之前,讓我們首先討論如何訪問 Matplotlib 顏色圖中的值以瞭解顏色圖的實現。它將使我們能夠建立自己選擇的自定義顏色圖。

在 Python 中使用 Matplotlib 的 get_cmap() 方法訪問顏色圖及其值

Matplotlib 模組中定義了各種顏色圖。每個顏色圖都被分配了唯一的名稱。我們可以使用 matplotlib 庫的 cm 模組中的 get_cmap() 方法訪問顏色圖。

get_cmap() 方法的語法如下。

matplotlib.cm.get_cmap(name=None, lut=None)
  1. name 引數接受顏色圖的名稱作為字串或 matplotlib.colors 模組中定義的 Colormap 物件。它的預設值為 None。如果我們沒有為引數名稱指定任何輸入,get_cmap() 方法將返回 viridis 顏色圖。
  2. 如果在 Matplotlib 庫中定義了具有指定名稱的顏色圖,則 get_cmap() 方法返回一個 Colormap 例項。
  3. 引數 lut 的預設值為 None。如果 lut 不是 None,它應該是一個整數,指定用於定義顏色圖的列表中的顏色數。
  4. 如果 name 不是有效的顏色圖並且 lut 不是 None,則重新取樣顏色圖以在查詢表中輸入 lut 值。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

cm.get_cmap("viridis", 8)

輸出:

matplotlib 顏色圖 - viridis

以上程式碼已經在 J​​upyter Notebook 的互動式 shell 中執行。如果你嘗試在不同的 IDE 中執行它,你可能會或可能不會將上述影象作為輸出。

get_cmap() 方法返回的顏色圖是可呼叫的。當我們將一個介於 0 和 1 之間的值傳遞給顏色圖物件時,它會返回一個 RGBA 值。

你可以在此示例中觀察到這一點。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

viridis = cm.get_cmap("viridis", 8)
print(viridis(0.56))

輸出:

(0.122312, 0.633153, 0.530398, 1.0)

在 Python 中使用 ListedColormap 物件的 colors 屬性建立自定義列出的顏色圖

要建立自定義 ListedColormap,讓我們首先看看顏色是如何儲存在 ListedColormap 中的。為此,我們可以使用 ListedColormap 物件的 colors 屬性。

例如,viridis 是一個 ListedColormap。我們可以使用 viridis 顏色圖的顏色屬性來觀察顏色值,如下例所示。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

viridis = cm.get_cmap("viridis", 8)
print(viridis.colors)

輸出:

[[0.267004 0.004874 0.329415 1.      ]
 [0.275191 0.194905 0.496005 1.      ]
 [0.212395 0.359683 0.55171  1.      ]
 [0.153364 0.497    0.557724 1.      ]
 [0.122312 0.633153 0.530398 1.      ]
 [0.288921 0.758394 0.428426 1.      ]
 [0.626579 0.854645 0.223353 1.      ]
 [0.993248 0.906157 0.143936 1.      ]]

在這裡,你可以看到顏色儲存在 Nx4 陣列中。你還可以通過使用所需的序列作為輸入引數呼叫顏色圖名稱來訪問 ListedColormap 的指定行數,如下所示。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

viridis = cm.get_cmap("viridis", 8)
print(viridis(range(0, 8)))

輸出:

[[0.267004 0.004874 0.329415 1.      ]
 [0.275191 0.194905 0.496005 1.      ]
 [0.212395 0.359683 0.55171  1.      ]
 [0.153364 0.497    0.557724 1.      ]
 [0.122312 0.633153 0.530398 1.      ]
 [0.288921 0.758394 0.428426 1.      ]
 [0.626579 0.854645 0.223353 1.      ]
 [0.993248 0.906157 0.143936 1.      ]]

如你所見,ListedColormap 使用列表表示。因此,要在 Python 中建立自定義 ListedColormap,我們必須建立一個表示顏色圖顏色的列表。

在 Python 中使用顏色名稱建立自定義列出的顏色圖

我們可以使用 ListedColormap() 方法建立自定義列表顏色圖。ListedColormap() 方法的語法如下。

matplotlib.colors.ListedColormap(colors, name="from_list", N=None)
  1. 引數 colors 採用顏色名稱或表示 RGBA 值的數值的陣列或列表。
  2. 引數 name 用於為建立的自定義顏色圖指定特定名稱。它有一個預設值 from_list
  3. 引數 N 表示顏色圖中的條目數。它的預設值為 None。當 N 的值為 None 時,colors 列表中的每種顏色都應該有一個顏色圖條目。

要使用 ListedColormap() 方法和顏色列表建立自定義列出的顏色圖,你可以將四種顏色的名稱傳遞給 ListedColormap() 方法。它將返回一個 Colormap 物件。

之後,你可以使用 Colormap 物件繪製資料,如下所示。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
cmap = ListedColormap(["darkorange", "gold", "lawngreen", "lightseagreen"])
c = np.linspace(0, 150, 12)
plt.scatter(xdata, ydata, c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()

輸出:

在 Python 中使用顏色名稱建立自定義列出的顏色圖

在 Python 中使用 RGBA 值建立自定義列出的顏色圖

你可以使用具有 RGBA 值的陣列來建立顏色圖,而不是使用顏色名稱,如下所示。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
colorarray = [
    [0.57647055, 0.4116, 0.27107143, 1],
    [0, 0.4116, 0.27107143, 1],
    [0.57647055, 0, 0.27107143, 1],
]
cmap = ListedColormap(colorarray)
c = np.linspace(0, 150, 12)
plt.scatter(xdata, ydata, c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()

輸出:

在 Python 中使用 RGBA 值建立自定義列出的顏色圖

在 Python 中如何建立自定義線性分段顏色圖

在建立自定義線性分段顏色圖之前,讓我們觀察顏色值如何儲存線上性分段顏色圖中。

線性分段顏色圖沒有 color 屬性。但是,我們可以呼叫帶有所需序列的顏色圖名稱作為輸入引數來觀察顏色值。

例如,我們可以如下檢視 copper 顏色圖的顏色值。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

copper = cm.get_cmap("copper", 8)
print(copper(range(0, 8)))

輸出:

[[0.         0.         0.         1.        ]
 [0.17647055 0.1116     0.07107143 1.        ]
 [0.35294109 0.2232     0.14214286 1.        ]
 [0.52941164 0.3348     0.21321429 1.        ]
 [0.70588219 0.4464     0.28428571 1.        ]
 [0.88235273 0.558      0.35535714 1.        ]
 [1.         0.6696     0.42642857 1.        ]
 [1.         0.7812     0.4975     1.        ]]

Python Matplotlib 中的 cdict 是什麼

LinearSegmentedColormap 類使用在其間插入 RGBA 值的錨點來定義線性分段顏色圖。

  1. 每個錨點都被指定為 [x[i] yleft[i] yright[i]] 形式的矩陣中的一行。x[i] 是錨點,yleft[i]yright[i] 是錨點兩側的顏色值。
  2. 如果顏色圖在錨點處不連續,則 yleft[i]yright[i] 將具有不同的值。否則,yleft[i]yright[i] 具有相同的值。
  3. 錨點儲存在顏色字典中,通常稱為 cdict。字典的鍵是 redgreenblue,對應的值是指定為 [x[i] yleft[i] yright[i]] 形式矩陣中的行的錨點。在 cdict 的每個條目中,x[i] 值必須從 0 單調增加到 1。

你可以按如下方式建立顏色字典。

cdict = {
    "blue": [[0.0, 0.0, 0.0], [0.5, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "red": [[0.0, 0.0, 0.0], [0.25, 0.0, 0.0], [0.75, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "green": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [1.0, 1.0, 1.0]],
}

在 Python 中使用錨點建立自定義線性分段顏色圖

建立 cdict 後,你可以使用 LinearSegmentedColormap() 方法建立線性分段顏色圖。LinearSegmentedColormap() 方法的語法如下。

matplotlib.colors.LinearSegmentedColormap(name, segmentdata, N=256, gamma=1.0)
  1. name 參數列示顏色圖的名稱。它必須是一個字串。
  2. 引數 segmentdatacdict 作為輸入引數。
  3. 引數 N 表示顏色圖查詢表中的點數。它的預設值為 256。
  4. 引數 gamma 表示用於 x 座標的縮放。它的預設值為 1.0。

如下所示,我們可以使用 LinearSegmentedColormap() 方法建立線性分段顏色圖。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
cdict = {
    "blue": [[0.0, 0.0, 0.0], [0.5, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "red": [[0.0, 0.0, 0.0], [0.25, 0.0, 0.0], [0.75, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "green": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [1.0, 1.0, 1.0]],
}
newcmp = LinearSegmentedColormap("testCmap", segmentdata=cdict, N=256)
c = np.linspace(0, 80, 12)
plt.scatter(xdata, ydata, c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()

輸出:

在 Python 中使用錨點建立自定義線性分段顏色圖

在 Python 中使用顏色名稱建立自定義線性分段顏色圖

除了使用 cdict,我們還可以使用顏色列表來建立自定義顏色圖。為此,我們可以使用 LinearSegmentedColormap.from_list() 方法。from_list() 方法的語法如下。

from_list(name, colors, N=256, gamma=1.0)

這裡,引數 colors 將顏色列表作為輸入引數。所有其他引數都類似於 LinearSegmentedColormap() 方法。

你可以使用 from_list() 方法建立線性分段顏色圖,如下所示。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
colorlist = ["darkorange", "gold", "lawngreen", "lightseagreen"]
newcmp = LinearSegmentedColormap.from_list("testCmap", colors=colorlist, N=256)
c = np.linspace(0, 80, 12)
plt.scatter(xdata, ydata, c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()

輸出:

在 Python 中使用顏色名稱建立自定義線性分段顏色圖

まとめ

本文討論了在 Python 中使用 Matplotlib 建立自定義顏色圖的不同方法。我們建立了列出的顏色圖和線性分段顏色圖,並使用顏色圖繪製了一些資料。

作者: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub

相關文章 - Matplotlib Color