海洋學的精美色彩圖: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()

您可以使用 cmocean.tools.lighten() 函數,將 alpha 值設定為低於 1 來調亮色彩圖,以便您可以覆蓋輪廓和其他更容易看見的線條
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 色彩圖是連續的,深藍色代表較低的較冷值,並透過紅色過渡到代表增加的較溫暖值的黃色。

來自德州農工大學地球化學與環境研究小組 (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.

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

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

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

上層海洋 CTD 資料的鹽度圖;由 Luz Zarate Jimenez 製作。
來自中大西洋地區協會海岸海洋觀測系統 (Mid-Atlantic Regional Association Coastal Ocean Observing System, MARACOOS) 的滑翔機資料。
灰色¶
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 色彩圖在大部分情況下都是連續的,代表海水中氧氣飽和度的正常範圍,並且在色彩圖的 80% 處發散以代表過飽和狀態。色彩圖的底部 20% 為紅色,以強調缺氧或低氧水,但如果紅色調對於應用程式不重要,仍然可以相對無縫地列印為灰階。發散後,色彩圖的頂部 20% 為黃色,以強調過飽和的水。此色彩圖的最小值和最大值旨在被控制,以便適當地放置低氧和過飽和的氧氣狀態。此色彩圖是為密西西比河羽流區域開發的,該區域定期出現並監測低氧和過飽和條件。

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

上層海洋 CTD 數據的氧氣圖;由 Luz Zarate Jimenez 製作。
深¶
深 色彩映射表是連續的,從淺黃色開始,可能表示較淺的水域,然後是淺綠色,最後是越來越深的藍色和紫色,表示深度增加。

海底地形圖,由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。
密¶
密 色彩映射表是連續的,低值為泛白的藍色,隨著值的增加而增加為紫色,可用於表示水密度的增加。以下顯示了兩個這種色彩映射表的範例,來自德州農工大學的滑翔機。此色彩映射表基於 matplotlib 的 Purples,但使用 viscm 工具從頭開始重建。


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

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

地震強度,由 Natalie Accardo 使用 GMT 製作。

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。
相位¶
相位 色彩映射表是圓形的,跨越設定亮度值的所有色調。此映射表旨在用於波相位和潮汐相位等屬性,這些屬性從 0° 到 360° 再到 0° 循環,並且應在色彩映射表中表示,而不會出現主要的感知跳躍。

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


空間時間海洋查詢系統 (STOQS)
增量¶
增量 色彩映射表從較深的藍色發散到略微偏白的顏色,然後通過黃綠色的陰影,可用於表示關鍵值(通常為零)附近的發散速度值。此色彩映射表受到 Francesca Samsel 類似色彩映射表的啟發,但使用 viscm 工具從頭開始生成。
苔原¶
苔原 色彩映射表是發散的,一側是乾燥的棕色陰影,另一側是一系列綠色和藍色。色彩映射表的正端旨在反映 雨 中的顏色,因此是 雨 的雨量異常(約為 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,作為 LUT 上的偏好設定檔
- 在 iGOTM 中,它模擬世界上任何地方的水柱。
- cmocean 色彩映射表包含在以下套件中
精美視覺化範例:¶
為什麼噴射是個糟糕的色彩映射表,以及如何選擇更好的色彩映射表:¶
- 這篇文章開啟了我的一切:為什麼工程師和科學家應該擔心顏色?
- Matteo Niccoli 關於噴射和選擇色彩映射表的優秀系列,它將真正教你你需要知道的知識
- Jake Vanderplas 對噴射的論點做了很好的總結
- 美國氣象學會 (BAMS) 公報中關於視覺化研究的良好 總結,並介紹了一種選擇良好色彩映射表的工具,該工具針對大氣研究,但適用範圍廣泛。
- 這個 工具 會將你的(小檔案大小)圖像轉換為患有各種色盲的人看起來的樣子,這樣你就可以針對你使用的顏色做出更好的決定。
- 來自 matplotlib 繪圖套件網站的說明文件,關於如何選擇色彩映射表 (colormaps)。
- 選擇良好科學色彩映射表的訣竅
- 彩虹的盡頭,一篇呼籲停止使用 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 或在 twitter 上 @thyngkm。