使用 Python Matplotlib 自定義顏色圖
- 在 Python 中使用 Matplotlib 建立自定義顏色圖
-
在 Python 中使用 Matplotlib 的
get_cmap()
方法訪問顏色圖及其值 -
在 Python 中使用
ListedColormap
物件的colors
屬性建立自定義列出的顏色圖 - 在 Python 中如何建立自定義線性分段顏色圖
- まとめ
顏色圖是顯示圖形中連續值和離散值之間變化的最有效方法之一。本文將討論在 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)
name
引數接受顏色圖的名稱作為字串或matplotlib.colors
模組中定義的Colormap
物件。它的預設值為None
。如果我們沒有為引數名稱指定任何輸入,get_cmap()
方法將返回viridis
顏色圖。- 如果在 Matplotlib 庫中定義了具有指定名稱的顏色圖,則
get_cmap()
方法返回一個Colormap
例項。 - 引數
lut
的預設值為None
。如果lut
不是None
,它應該是一個整數,指定用於定義顏色圖的列表中的顏色數。 - 如果
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)
輸出:
以上程式碼已經在 Jupyter 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)
- 引數
colors
採用顏色名稱或表示 RGBA 值的數值的陣列或列表。 - 引數
name
用於為建立的自定義顏色圖指定特定名稱。它有一個預設值from_list
。 - 引數 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 中使用 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=[[.57647055, 0.4116, 0.27107143 ,1 ],[0, 0.4116, 0.27107143 ,1 ],[.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 中如何建立自定義線性分段顏色圖
在建立自定義線性分段顏色圖之前,讓我們觀察顏色值如何儲存線上性分段顏色圖中。
線性分段顏色圖沒有 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 值的錨點來定義線性分段顏色圖。
- 每個錨點都被指定為
[x[i] yleft[i] yright[i]]
形式的矩陣中的一行。x[i]
是錨點,yleft[i]
和yright[i]
是錨點兩側的顏色值。 - 如果顏色圖在錨點處不連續,則
yleft[i]
和yright[i]
將具有不同的值。否則,yleft[i]
和yright[i]
具有相同的值。 - 錨點儲存在顏色字典中,通常稱為
cdict
。字典的鍵是red
、green
和blue
,對應的值是指定為[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)
name
參數列示顏色圖的名稱。它必須是一個字串。- 引數
segmentdata
將cdict
作為輸入引數。 - 引數 N 表示顏色圖查詢表中的點數。它的預設值為 256。
- 引數
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 中使用顏色名稱建立自定義線性分段顏色圖
除了使用 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 中使用 Matplotlib 建立自定義顏色圖的不同方法。我們建立了列出的顏色圖和線性分段顏色圖,並使用顏色圖繪製了一些資料。