Python氣象數(shù)據(jù)處理與繪圖(19):如何使用NCL色板(調(diào)色盤思路相同)

更多內(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個隨機(jī)數(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)
image.png

使用調(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個隨機(jī)數(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)
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容