海洋學的優美色彩映射:cmocean¶
這個套件包含常用於海洋學變數的色彩映射。大多數色彩映射最初來自matplotlib色彩映射,但現在已使用viscm 工具調整為感知均勻。
注意
這是 cmocean 的新版本,包含四個新的色彩映射!
注意
我們有一篇論文,其中包含針對您的應用程式選擇色彩映射的指南,以及 cmocean 色彩映射的描述
Thyng, K. M., Greene, C. A., Hetland, R. D., Zimmerle, H. M., & DiMarco, S. F. (2016). True colors of oceanography. Oceanography, 29(3), 10.
這是我們的圖庫
import cmocean
cmocean.plots.plot_gallery()

這些色彩映射的選擇旨在達到感知均勻,並在循序、發散或循環(相位色彩映射)方面反映它們所代表的資料,且直觀。例如,algae 色彩映射是綠色的陰影,可以代表葉綠素。
這是色彩映射的亮度
import cmocean
cmocean.plots.plot_lightness()

或許在 cam02ucs 色彩空間中思考會更好,在該空間中,歐幾里得距離等同於人類感知上的變化。使用viscm 工具可以查看此色彩空間中這些色彩映射的圖表以及其他一些重要屬性。
以下是一些來自 haline 色彩映射的屬性。我們可以看到,該色彩映射可以很好地列印為灰階,在整個色彩映射中具有一致的感知差異,並且對於色盲人士具有良好的可視性。它在其 3D 色彩空間中具有平滑的表示,並且影像中的細節清晰。
import cmocean
cmocean.plots.wrap_viscm(cmocean.cm.haline, saveplot=False)

使用 viscm 工具對色彩映射的所有評估都顯示在頁面viscm 工具中的 cmocean 色彩映射中。
安裝¶
若要安裝:pip install cmocean
若要使用 Anaconda 安裝:conda install -c conda-forge cmocean
如果您想使用 plots 子模組,則可以改用以下方式安裝
pip install "cmocean[plots]"
這也會安裝 viscm
和 colorspacious
。
功能¶
所有色彩映射都在 cmocean.cm
中提供。它們可以存取並簡單地繪製,如下所示
import cmocean
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 3))
ax = fig.add_subplot(1, 2, 1)
cmocean.plots.test(cmocean.cm.thermal, ax=ax)
ax = fig.add_subplot(1, 2, 2)
cmocean.plots.quick_plot(cmocean.cm.algae, ax=ax)

可以使用 cmocean.cm.cmapnames
存取所有可用的色彩映射名稱
In [1]: import cmocean
In [2]: cmocean.cm.cmapnames
Out[2]:
['thermal',
'haline',
'solar',
'ice',
'gray',
'oxy',
'deep',
'dense',
'algae',
'matter',
'turbid',
'speed',
'amp',
'tempo',
'rain',
'phase',
'topo',
'balance',
'delta',
'curl',
'diff',
'tarn']
可以使用以下方式存取色彩映射的實例
In [3]: import cmocean
In [4]: cmaps = cmocean.cm.cmap_d;
使用 256 個 rgb 項目將所有可用的色彩映射列印到文字檔案中,使用
cmaps = cmocean.cm.cmap_d
cmocean.tools.print_colormaps(cmaps)
輸出一個字典以定義色彩映射,使用
In [5]: import cmocean
In [6]: cmdict = cmocean.tools.get_dict(cmocean.cm.matter, N=9)
In [7]: print(cmdict)
{'red': [(0.0, 0.99429361496112023, 0.99429361496112023), (0.125, 0.97669801635856757, 0.97669801635856757), (0.25, 0.94873479766923496, 0.94873479766923496), (0.375, 0.90045567698531204, 0.90045567698531204), (0.5, 0.80852468744463613, 0.80852468744463613), (0.625, 0.67108411902889908, 0.67108411902889908), (0.75, 0.51122751026810531, 0.51122751026810531), (0.875, 0.34246319725680402, 0.34246319725680402), (1.0, 0.18517171283533682, 0.18517171283533682)], 'green': [(0.0, 0.93032779532320797, 0.93032779532320797), (0.125, 0.75576791099973906, 0.75576791099973906), (0.25, 0.58413112562241909, 0.58413112562241909), (0.375, 0.41389524263548055, 0.41389524263548055), (0.5, 0.26372603126828165, 0.26372603126828165), (0.625, 0.16249519232276352, 0.16249519232276352), (0.75, 0.10922326738769267, 0.10922326738769267), (0.875, 0.089677516287552023, 0.089677516287552023), (1.0, 0.05913348735199072, 0.05913348735199072)], 'blue': [(0.0, 0.69109690224984077, 0.69109690224984077), (0.125, 0.53031307900834646, 0.53031307900834646), (0.25, 0.40291681995676154, 0.40291681995676154), (0.375, 0.32938102171259315, 0.32938102171259315), (0.5, 0.33885361881305626, 0.33885361881305626), (0.625, 0.37820659039971588, 0.37820659039971588), (0.75, 0.38729596513525039, 0.38729596513525039), (0.875, 0.33739313395770171, 0.33739313395770171), (1.0, 0.24304267442183591, 0.24304267442183591)]}
使用 cmap = cmocean.tools.cmap(rgbin, N=10)
,並給定 rgb 輸入陣列,來建立色彩映射的實例。
所有色彩映射的反向版本都可以透過將 "_r" 附加到色彩映射名稱來取得,就像在 matplotlib 中一樣
import cmocean
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 3))
ax = fig.add_subplot(1, 2, 1)
cmocean.plots.test(cmocean.cm.gray, ax=ax)
ax = fig.add_subplot(1, 2, 2)
cmocean.plots.test(cmocean.cm.gray_r, ax=ax)
fig.tight_layout()

您可以使用小於 1 的 alpha 值,透過 cmocean.tools.lighten() 函式來減輕色彩映射,以便您可以覆蓋輪廓和其他更容易看見的線條
import cmocean
import cmocean.cm as cmo
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 3))
ax = fig.add_subplot(1, 2, 1)
Z = np.random.randn(10,10)
ax.pcolormesh(Z, cmap=cmo.matter)
ax = fig.add_subplot(1, 2, 2)
lightcmap = cmocean.tools.lighten(cmo.matter, 0.5)
ax.pcolormesh(Z, cmap=lightcmap)
fig.tight_layout()

cmocean 會向 matplotlib 註冊其色彩映射,因此您可以使用例如 'cmo.amp' 來呼叫它們
import cmocean
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4, 3))
ax = fig.add_subplot(111)
Z = np.random.randn(10,10)
ax.pcolormesh(Z, cmap='cmo.amp')

裁剪色彩映射¶
您可以透過您打算繪製的值或百分比來裁剪掉色彩映射的一端或兩端。例如,您可以透過百分比來裁剪掉色彩映射的兩端,以減少亮度範圍,而不會有最暗的值
import cmocean
import matplotlib.pyplot as plt
cmap = cmocean.cm.tarn
fig, axes = plt.subplots(1, 2, figsize=(8,4))
A = np.random.randint(-5, 6, (10,10))
mappable = axes[0].pcolormesh(A, cmap=cmap)
axes[0].set_title('Full diverging colormap')
fig.colorbar(mappable, ax=axes[0])
newcmap = cmocean.tools.crop_by_percent(cmap, 30, which='both', N=None)
mappable = axes[1].pcolormesh(A, cmap=newcmap)
axes[1].set_title('Same colormap,\n30% removed from each end')
fig.colorbar(mappable, ax=axes[1])

您可以透過百分比來裁剪掉色彩映射的一端。例如,您可以裁剪掉 oxy 色彩映射的頂部,以防您不考慮過度飽和的條件(色彩映射的頂部 20%),您可以從色彩映射中移除它,如下所示
import cmocean
import matplotlib.pyplot as plt
cmap = cmocean.cm.oxy
fig, axes = plt.subplots(1, 2, figsize=(8,4))
A = np.random.randint(0, 101, (10,10))
mappable = axes[0].pcolormesh(A, vmin=0, vmax=100, cmap=cmap)
axes[0].set_title('Values go to super-saturated')
fig.colorbar(mappable, ax=axes[0])
newcmap = cmocean.tools.crop_by_percent(cmap, 20, which='max', N=None)
A[A>80] = 80
mappable = axes[1].pcolormesh(A, vmin=0, vmax=80, cmap=newcmap)
axes[1].set_title('Values are all\nbelow super-saturated')
fig.colorbar(mappable, ax=axes[1])

您可以透過輸入您打算在圖表中使用的值來移除色彩映射一端的一部分,並讓函式計算出要從色彩映射裁剪掉多少。如果您結合了海深和地形(海洋和陸地高度)資料以使用 topo 色彩映射繪製,但您希望水和陸地的最大量值不同,並在色彩映射中反映這一點,這可能特別有用。
import cmocean
import matplotlib.pyplot as plt
cmap = cmocean.cm.topo
fig, axes = plt.subplots(1, 2, figsize=(8,4))
A = np.random.randint(-50, 201, (10,10))
mappable = axes[0].pcolormesh(A, vmin=-200, vmax=200, cmap=cmap)
axes[0].set_title('No values<-50, but still\nshow possibility in colorbar')
fig.colorbar(mappable, ax=axes[0])
newcmap = cmocean.tools.crop(cmap, -50, 200, 0)
mappable = axes[1].pcolormesh(A, vmin=-50, vmax=200, cmap=newcmap)
axes[1].set_title('Colorbar only shows color\nrange used by data')
fig.colorbar(mappable, ax=axes[1])

色彩映射詳細資訊¶
thermal¶
thermal 色彩映射是循序的,深藍色代表較低、較冷的值,並透過紅色過渡到黃色,代表較高的溫暖值。

來自德州農工大學地球化學和環境研究組 (Geochemical and Environmental Research Group, GERG) 的滑翔機資料。

來自出版物的資料:Kenel, C., Grolimund, D., Li, X., Panepucci, E., Samson, V. A., Sanchez, D. F., … & Leinenbach, C. (2017). In situ investigation of phase transformations in Ti-6Al-4V under additive manufacturing conditions combining laser melting and high-speed micro-X-ray diffraction. Scientific reports, 7(1), 16358.

Usamentiaga, R., Ibarra-Castanedo, C., Klein, M., Maldague, X., Peeters, J., & Sanchez-Beato, A. (2017). Nondestructive evaluation of carbon fiber bicycle frames using infrared thermography. Sensors, 17(11), 2679.

上層海洋的 CTD 資料的溫度圖;由 Luz Zarate Jimenez 製作。

全水深瓶資料的 pH 值圖,其中點代表收集瓶裝水的深度;由 Luz Zarate Jimenez 製作。

WUNSCH, C. (2018). Towards determining uncertainties in global oceanic mean values of heat, salt, and surface elevation. Tellus A: Dynamic Meteorology and Oceanography, 70(1), 1-14.

來自中大西洋區域協會海岸海洋觀測系統 (MARACOOS) 的滑翔機資料。
來自tecplot的海洋模型視覺化。
Potter, H. (2018). The cold wake of typhoon Chaba (2010). Deep Sea Research Part I: Oceanographic Research Papers, 140, 136-141.
haline¶
haline 色彩映射是循序的,可以用於深藍色代表較低的鹽度或淡水,並透過綠色過渡到淺黃色,代表增加的鹽度或較鹹的水。此色彩映射基於 matplotlib 的 YlGnBu,但使用 viscm 工具從頭開始重建。

使用 R oce 套件繪製 CTD 資料(溫度和鹽度),由Clark Richards製作

全水深瓶資料的鹼度圖,其中點代表收集瓶裝水的深度;由 Luz Zarate Jimenez 製作。

上層海洋的 CTD 資料的鹽度圖;由 Luz Zarate Jimenez 製作。
來自中大西洋區域協會海岸海洋觀測系統 (MARACOOS) 的滑翔機資料。
gray¶
gray 色彩映射是從黑色到白色的循序變化,透過感知色彩空間具有均勻的步驟。此色彩映射是通用的,可用於任何循序資料集。
import cmocean
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 3))
ax = fig.add_subplot(1, 2, 1)
cmocean.plots.test(cmocean.cm.gray, ax=ax)
ax = fig.add_subplot(1, 2, 2)
cmocean.plots.quick_plot(cmocean.cm.gray, ax=ax)

oxy¶
oxy 色彩映射表在大多數情況下是連續的,代表海水中氧氣飽和度的正常範圍,並在色彩映射表的 80% 處發散,以表示過飽和狀態。色彩映射表的底部 20% 為紅色,以突顯缺氧或低氧水域,但為了在應用程式中紅色色調不重要時仍能相對無縫地列印成灰階。發散後,色彩映射表的頂部 20% 為黃色,以突顯過飽和的水域。此色彩映射表的最小值和最大值旨在加以控制,以便正確放置低氧和過飽和氧氣狀態。此色彩映射表是為密西西比河羽狀流區域開發的,該區域經常出現並監測到低氧和過飽和的狀況。

德州農工大學物理海洋學數值小組 (PONG) 在墨西哥西北部灣的模型輸出。利用底部氧氣利用率的簡單參數化模擬底部氧氣,揭示了底部氧氣的複雜結構。雖然受缺氧影響的區域沿著陸棚延伸近 400 公里,但在小得多的尺度上(可達幾公里)也存在變異性。密西西比河/阿查法拉亞河羽狀流的位置以及羽狀流中存在的不穩定性,決定了缺氧底部水域的範圍和結構。由德州農工大學的Veronica Ruiz 提供。

上層海洋 CTD 資料的氧氣圖;由 Luz Zarate Jimenez 製作。
深色¶
deep 色彩映射表是連續的,從淺黃色開始,可能代表較淺的水域,通過淡綠色過渡到越來越深的藍色和紫色,以表示深度增加。

海底地形圖,由Iury Sousa 提供

索莫夫海海底地形,由 Josué Martinez Moreno 在blender中製作
Gwyther, D. E., O’Kane, T. J., Galton-Fenzi, B. K., Monselesan, D. P., & Greenbaum, J. S. (2018)。固有過程驅動托滕冰川冰架底層融化的變異性。《自然通訊》,9(1),3141。
密集¶
dense 色彩映射表是連續的,低值為帶白色的藍色,並隨著值的增加而增加紫色,可用於表示水密度的增加。下面顯示了此色彩映射表的兩個範例,來自德州農工大學的滑翔機。此色彩映射表基於 matplotlib 的 Purples,但使用 viscm 工具從頭開始重新建立。


上層海洋 CTD 資料的潛在密度圖;由 Luz Zarate Jimenez 製作。
藻類¶
algae 色彩映射表是連續的,低值為帶白色的綠色,並隨著值的增加而增加綠色,可用於表示水中葉綠素的增加。下面顯示了此色彩映射表的兩個範例,來自德州農工大學的滑翔機。此色彩映射表基於 matplotlib 的 Greens,但使用 viscm 工具從頭開始重新建立。

振幅¶
amp 色彩映射表是從帶白色到深紅色的連續的,可用於表示波高值的增加。此色彩映射表是 balance 色彩映射表的正半部分。

Baumgartner, B. L., O’Laughlin, R., Jin, M., Tsimring, L. S., Hao, N., & Hasty, J. (2018)。基於黃素的代謝週期是單細胞酵母生長和分裂的組成部分。《科學報告》,8(1),18045。
Lenhart, H. J., & Große, F. (2018)。在 OSPAR 框架內使用跨界營養建模評估 WFD 減少營養的影響。《海洋科學前沿》,5,447。
Grunert, B. K., Brunner, S. L., Hamidi, S. A., Bravo, H. R., & Klump, J. V. (2018)。量化寒冷水入侵在對比年份的淺層沿海系統中的影響:密西根湖格林灣。《大湖研究雜誌》,44(5),851-863。
相位¶
phase 色彩映射表是圓形的,在設定的亮度值下跨越所有色調。此映射表旨在用於波浪相位和潮汐相位等屬性,這些屬性從 0˚ 到 360˚ 到 0˚ 迴繞,並且應在色彩映射表中沒有明顯的感知跳躍的情況下表示。

Kristen Thyng 繪製的北大西洋潮汐相位。
平衡¶
balance 色彩映射表是發散的,從深藍色到灰白色到深紅色,表示負值到零值到正值;這可用於表示海平面高度,其中海平面高度的偏差以遠離中性灰白色的顏色陰影表示。在這種情況下,已選擇紅色陰影來表示高於參考值(通常是平均海平面)的海平面高度,以便與通常與自由表面增加相關的較溫暖水域連接,例如墨西哥灣的環流。此色彩映射表的範例來自德克薩斯州和路易斯安那州陸棚的數值模擬。此色彩映射表基於 matplotlib 的 RdBu,但使用 viscm 工具從頭開始重新建立。


時空海洋學查詢系統(STOQS)
增量¶
delta 色彩映射表是發散的,從較深的藍色到略帶灰白色,通過黃綠色的陰影,可用於表示臨界值(通常為零)周圍發散的速度值。此色彩映射表靈感來自Francesca Samsel 類似的色彩映射表,但使用 viscm 工具從頭開始產生。
潭¶
tarn 色彩映射表是發散的,一側是棕色的乾燥陰影,另一側是綠色和藍色的範圍。色彩映射表的正端旨在反映 rain 中的顏色,因此是 rain 的降雨異常(約為 0 或其他臨界值)的互補色彩映射表。
資源¶
以下是一些我最喜歡的資源。
cmocean 在其他地方可用!¶
- 適用於MATLAB,由Chad Greene 提供
- 適用於 R:Oce 海洋學分析套件,由Dan Kelley 和 Clark Richards 提供
- 適用於海洋資料檢視器
- 適用於通用製圖工具 (GMT),位於cpt-city,以及github
- 對於 Paraview,靈感來自 Phillip Wolfram。
- 在 Plotly 中
- Chad Greene 的 Matlab 南極地圖工具 使用了 cmocean
- 對於 Tableau,以偏好設定檔的形式存在於 github 上
- 對於 ImageJ,以偏好設定檔的形式存在於 LUTs 中
- 在 iGOTM 中,它可以模擬世界任何地方的水柱。
- cmocean 色彩映射包含在以下套件中
精美視覺化範例:¶
為什麼 jet 是一種不好的色彩映射,以及如何選擇更好的:¶
- 這是我一切的起點文章:為什麼工程師和科學家應該擔心顏色?
- Matteo Niccoli 撰寫的一系列關於 jet 和選擇色彩映射的出色文章,將真正教會您所需的一切知識:Matteo Niccoli
- Jake Vanderplas 對 jet 的論點做了很好的總結:Jake Vanderplas
- 《美國氣象學會公報》(BAMS) 中一篇關於視覺化研究和選擇良好色彩映射的工具的良好總結,目標是針對大氣研究,但也廣泛適用。
- 這個工具會將您的(小檔案大小)影像轉換為色盲人士看到的樣子,讓您可以對使用的顏色做出更好的決策。
- 來自 matplotlib 繪圖套件網站的文件,用於選擇色彩映射。
- 選擇良好科學色彩映射的訣竅
- 彩虹的盡頭,呼籲停止使用 jet。
- 研究顯示 jet 對您的健康有害!
- 對先前研究的重新檢視似乎顯示,視覺證據表明,鋒面實際上只是 jet 色彩映射的產物
2014 年和 2015 年 SciPy 會議上有一系列關於色彩映射的演講
- Damon McDougall 介紹使用 jet 表示資料的問題。
- Kristen Thyng 接著介紹如何選擇更好的色彩映射,包括使用感知上均勻的色彩映射,並考慮所表示的資訊本質上是順序還是發散。
- Nathaniel Smith 和 Stéfan van der Walt 進一步說明 jet 色彩映射不好,甚至對您的健康有害!他們接著為 Python 繪圖庫 matplotlib 提出新的色彩映射。
- Kristen Thyng 以 Nathaniel 和 Stéfan 的研究為基礎,提出用於繪製典型海洋學量的色彩映射(這導致了 cmocean!)。
製作精美圖表的其他訣竅:¶
- 這個 連結 有許多關於選擇線條顏色、色彩映射,以及使用離散與連續色彩映射的訣竅。
- 如何畫出糟糕的圖表或不該做的事 特別提供線圖和長條圖的訣竅,並包含設計大師 Edward Tufte 的一些訣竅摘要。
聯絡方式¶
Kristen Thyng 是 cmocean 的主要開發人員。如有任何問題、意見或想法,請寄電子郵件。我正在收集色彩映射在實際使用中的範例(請見上方),也收集色彩映射的使用者,所以如果您正在使用 cmocean,我很樂意收到您的來信。kthyng 在 gmail.com 或在推特上 @thyngkm。