更多內(nèi)容詳見https://www.yxybiubiubiu.com/2020/06/06/color/
一嚎于、 使用NCL色板(使用調(diào)色盤文件思路相同)
NCL的色板十分豐富是晨,幾乎可以涵蓋平常所需绪囱。詳見:傳送門
那么我們能否將NCL的色板用在python中呢拄查?答案當(dāng)然是可以的。
我在氣象家園發(fā)現(xiàn)了個帖子恰矩,樓主自己封裝了一個包仿便,可以在python中調(diào)用NCL的色板,詳見:傳送門稻扬,一般來說這個包足夠大家日常使用了卦方。一些想進(jìn)一步了解原理并且進(jìn)行擴(kuò)展應(yīng)用的朋友,可以接著往下看泰佳。
其基本原理就是讀取NCL色板的.rgb文件盼砍,將其信息轉(zhuǎn)換為顏色數(shù)組,形成matplotlib色板逝她。那么下面浇坐,我就根據(jù)這個思路,解釋下其過程和原理黔宛。首先我將NCL已有色板.rgb文件整理上傳了近刘,下載點這里,下載后將壓縮包內(nèi)文件夾解壓臀晃。
.rgb文件內(nèi)容如下(以3gauss.rgb為例):
# r g b
0 0 255
0 0 255
1 2 254
2 4 253
3 6 252
...
...
...
ncolors = 254觉渴,代表該色板有254個色號,第二行為注釋內(nèi)容徽惋,表明接下來的每一行案淋,顏色存放都是red,green,blue的順序。那么接下來我們只需要讀取這個文件寂曹,將顏色存為一個[254,3]的數(shù)組哎迄,然后將數(shù)組除255即可。除255的原因是隆圆,python的顏色值位于[0,1]之間漱挚,而rgb信息位于[0,255]之間,所以除255就可以將顏色信息映射在[0,1]之間渺氧。
但是旨涝!有一個問題,我查看了NCL的一些色板侣背,這些色板的格式并不統(tǒng)一白华,有些是直接映射在[0,1]之間了,有些文件頭有很多行贩耐,總之很雜亂弧腥,用之前還是需要統(tǒng)一格式,做好質(zhì)量控制的潮太。(我后邊有時間的話考慮將這些文件統(tǒng)一格式再重新上傳管搪。)
下面給出一個使用NCL色板的示例:
import pandas as pd
import numpy as np
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
#讀取.rgb文件
rgb = pd.read_csv('./colormaps/3gauss.rgb',sep='\s+',skiprows=2,names=['r','g','b']).values/255
#將rgb信息映射為colormap
colormap = ListedColormap(rgb)
#創(chuàng)建100個隨機數(shù)
colors = np.random.randint(0,100,size=100)
x,y = np.random.rand(100),np.random.rand(100)
#繪制散點圖虾攻,使用NCL中的3gauss色板
sct = plt.scatter(x, y, s=100, c=colors,cmap=colormap,edgecolors='black')
plt.colorbar(sct)
使用調(diào)色盤軟件生成的色板也是同樣的思路,將生成的txt內(nèi)的rgb信息讀取映射更鲁,就可以使用了霎箍。
二、設(shè)定色板顏色澡为,進(jìn)行插值映射
最后再介紹一種創(chuàng)建色板的方式漂坏,那就是挑選幾種自己需要的顏色排列起來,然后進(jìn)行插值媒至,形成顏色之間的漸變顶别,最后映射為色板。
import pandas as pd
import numpy as np
from matplotlib.colors import ListedColormap
import matplotlib.colors as colors
import matplotlib.pyplot as plt
#設(shè)定色板基礎(chǔ)色為黑紅橘藍(lán)
colorslist = ['black','red','orange','blue']
#將四種色插值為具有300個漸變色的色板
colormap = colors.LinearSegmentedColormap.from_list('123',colorslist,N=300)
#創(chuàng)建100個隨機數(shù)
colors = np.random.randint(0,100,size=100)
x,y = np.random.rand(100),np.random.rand(100)
#繪制散點圖拒啰,使用剛剛自定義的123色板
sct = plt.scatter(x, y, s=100, c=colors,cmap=colormap,edgecolors='black')
plt.colorbar(sct)