Matplotlib - 顏色對映



顏色對映(通常稱為顏色表或調色盤)是一組按特定順序排列的顏色,用於直觀地表示資料。請參見下圖以供參考:

Input

Matplotlib的上下文中,顏色對映在將數值對映到各種繪圖中的顏色方面起著至關重要的作用。Matplotlib 提供內建的顏色對映和外部庫(如 Palettable),甚至允許我們建立和操作自己的顏色對映。

Matplotlib 中的顏色對映

Matplotlib 提供許多內建的顏色對映,例如“viridis”或“copper”,這些可以透過matplotlib.colormaps容器訪問。它是一個通用的註冊例項,返回一個顏色對映物件。

示例

以下示例獲取 matplotlib 中所有已註冊顏色對映的列表。

from matplotlib import colormaps
print(list(colormaps)) 

輸出

['magma', 'inferno', 'plasma', 'viridis', 'cividis', 'twilight', 'twilight_shifted', 'turbo', 'Blues', 'BrBG', 'BuGn', 'BuPu', 'CMRmap', 'GnBu', 'Greens', 'Greys', 'OrRd', 'Oranges', 'PRGn', 'PiYG', 'PuBu', 'PuBuGn', 'PuOr', 'PuRd', 'Purples', 'RdBu', 'RdGy', 'RdPu', 'RdYlBu', 'RdYlGn', 'Reds', 'Spectral', 'Wistia', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd', 'afmhot', 'autumn', 'binary', 'bone', 'brg', 'bwr', 'cool', 'coolwarm', 'copper', 'cubehelix', 'flag', 'gist_earth', 'gist_gray', 'gist_heat', 'gist_ncar', 'gist_rainbow', 'gist_stern', 'gist_yarg', 'gnuplot', 'gnuplot2', 'gray', 'hot', 'hsv', 'jet', 'nipy_spectral', 'ocean', …]

訪問顏色對映及其值

您可以使用matplotlib.colormaps['viridis']獲取命名顏色對映,它返回一個顏色對映物件。獲得顏色對映物件後,您可以透過重新取樣顏色對映來訪問其值。在這種情況下,viridis是一個顏色對映物件,當傳遞 0 到 1 之間的浮點數時,它會從顏色對映返回一個 RGBA 值。

示例

這是一個訪問顏色對映值的示例。

import matplotlib 
viridis = matplotlib.colormaps['viridis'].resampled(8)
print(viridis(0.37))

輸出

(0.212395, 0.359683, 0.55171, 1.0)

建立和操作顏色對映

Matplotlib 提供了建立或操作您自己的顏色對映的靈活性。此過程涉及使用ListedColormapLinearSegmentedColormap類。

使用 ListedColormap 建立顏色對映

ListedColormaps類可用於透過提供顏色規範列表或陣列來建立自定義顏色對映。您可以使用它來使用顏色名稱或 RGB 值構建新的顏色對映。

示例

以下示例演示如何使用具有特定顏色名稱的ListedColormap類建立自定義顏色對映。

import matplotlib as mpl
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import numpy as np

# Creating a ListedColormap from color names
colormaps = [ListedColormap(['rosybrown', 'gold', "crimson", "linen"])]

# Plotting examples
np.random.seed(19680801)
data = np.random.randn(30, 30)
n = len(colormaps)

fig, axs = plt.subplots(1, n, figsize=(7, 3), layout='constrained', squeeze=False)
for [ax, cmap] in zip(axs.flat, colormaps):
   psm = ax.pcolormesh(data, cmap=cmap, rasterized=True, vmin=-4, vmax=4)
   fig.colorbar(psm, ax=ax)

plt.show()
輸出

執行上述程式後,您將獲得以下輸出:

Output 1

使用 LinearSegmentedColormap 建立顏色對映

LinearSegmentedColormap類允許透過指定錨點及其對應的顏色來進行更多控制。這使得能夠建立具有插值值的顏色對映。

示例

以下示例演示如何使用具有特定顏色名稱列表的LinearSegmentedColormap類建立自定義顏色對映。

import matplotlib as mpl
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.pyplot as plt
import numpy as np

# Creating a LinearSegmentedColormap from a list
colors = ["rosybrown", "gold", "lawngreen", "linen"]
cmap_from_list = [LinearSegmentedColormap.from_list("SmoothCmap", colors)]

# Plotting examples
np.random.seed(19680801)
data = np.random.randn(30, 30)
n = len(cmap_from_list)

fig, axs = plt.subplots(1, n, figsize=(7, 3), layout='constrained', squeeze=False)
for [ax, cmap] in zip(axs.flat, cmap_from_list):
   psm = ax.pcolormesh(data, cmap=cmap, rasterized=True, vmin=-4, vmax=4)
   fig.colorbar(psm, ax=ax)

plt.show()
輸出

執行上述程式後,您將獲得以下輸出:

Output 2

反轉顏色對映

可以使用colormap.reversed()方法反轉顏色對映。這將建立一個新的顏色對映,它是原始顏色對映的反轉版本。

示例

此示例生成原始顏色對映及其反轉版本的並排視覺化。

from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import numpy as np

# Define a list of color values in hexadecimal format
colors = ["#bbffcc", "#a1fab4", "#41b6c4", "#2c7fb8", "#25abf4"]

# Create a ListedColormap with the specified colors
my_cmap = ListedColormap(colors, name="my_cmap")

# Create a reversed version of the colormap
my_cmap_r = my_cmap.reversed()

# Define a helper function to plot data with associated colormap
def plot_examples(colormaps):
   np.random.seed(19680801)
   data = np.random.randn(30, 30)
   n = len(colormaps)
   fig, axs = plt.subplots(1, n, figsize=(n * 2 + 2, 3), layout='constrained', squeeze=False)
    
   for [ax, cmap] in zip(axs.flat, colormaps):
      psm = ax.pcolormesh(data, cmap=cmap, rasterized=True, vmin=-4, vmax=4)
      fig.colorbar(psm, ax=ax)
   plt.show()

# Plot the original and reversed colormaps
plot_examples([my_cmap, my_cmap_r])
輸出

執行上述程式後,您將獲得以下輸出:

Output 3

更改預設顏色對映

要更改所有後續繪圖的預設顏色對映,您可以使用mpl.rc()修改預設顏色對映設定。

示例

這是一個透過修改全域性 Matplotlib 設定(如 mpl.rc('image', cmap='RdYlBu_r'))將預設顏色對映更改為RdYlBu_r的示例。

import numpy as np
from matplotlib import pyplot as plt
import matplotlib as mpl

# Generate random data 
data = np.random.rand(4, 4)

# Create a figure with two subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(7, 4))

# Plot the first subplot with the default colormap
ax1.imshow(data)
ax1.set_title("Default colormap")

# Set the default colormap globally to 'RdYlBu_r'
mpl.rc('image', cmap='RdYlBu_r')

# Plot the modified default colormap
ax2.imshow(data)
ax2.set_title("Modified default colormap")

# Display the figure with both subplots
plt.show()

輸出

執行上述程式碼後,我們將獲得以下輸出:

Output 4

透過顏色對映繪製帶顏色的線條

要透過顏色對映繪製具有不同顏色的多條線,您可以利用 Matplotlib 的 plot() 函式以及顏色對映來為每條線分配不同的顏色。

示例

以下示例透過迭代範圍並使用 plot() 函式中的 color 引數從顏色對映中為每條線分配不同的顏色來繪製多條線。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

# Generate x and y data
x = np.linspace(0, 2 * np.pi, 64)
y = np.exp(x)

# Plot the initial line
plt.plot(x, y)

# Define the number of lines and create a colormap
n = 20
colors = plt.cm.rainbow(np.linspace(0, 1, n))

# Plot multiple lines with different colors using a loop
for i in range(n):
   plt.plot(x, i * y, color=colors[i])

plt.xlim(4, 6)
plt.show()

輸出

執行上述程式碼後,我們將獲得以下輸出:

Output 5
廣告