海洋学中的精美色标:cmocean¶
此软件包包含用于常用海洋学变量的色标。大多数色标最初源自matplotlib色标,但现在已使用viscm 工具进行了调整,以实现感知均匀。
注意
这是cmocean的新版本,包含四个新色标!
注意
我们有一篇论文,其中包含了适用于您应用的色标选择指南以及cmocean色标的描述
Thyng, K. M., Greene, C. A., Hetland, R. D., Zimmerle, H. M., & DiMarco, S. F. (2016). 海洋学的真实色彩。Oceanography, 29(3), 10。
这是我们的图库
import cmocean
cmocean.plots.plot_gallery()

这些色标被选择为感知均匀,并在表示数据方面具有顺序性、发散性或循环性(相位色标),并且直观。例如,algae 色标是绿色调,可以表示叶绿素。
这是色标的亮度
import cmocean
cmocean.plots.plot_lightness()

最好在 cam02ucs 颜色空间中思考,其中欧几里得距离被等同于人类感知的变化。使用viscm 工具可以看到这些色标在此颜色空间中的绘图以及一些其他重要属性。
以下是 haline 色标的一些属性。我们可以看到,该色标在灰度打印时效果很好,在整个色标中具有一致的感知增量,并且对色盲人士具有良好的可见性。它在三维颜色空间中具有平滑的表示,并且图像中的细节清晰可见。
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)]}
给定 rgb 输入数组,使用cmap = cmocean.tools.cmap(rgbin, N=10)
创建一个色标实例。
所有色标的反转版本都可以通过在色标名称后附加“_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¶
thermal 色标是顺序的,深蓝色代表较低、较冷的值,通过红色过渡到黄色代表较高的、较暖的值。

来自德克萨斯 A&M 大学地球化学与环境研究小组 (GERG) 的滑翔机数据。

数据来自出版物:Kenel, C., Grolimund, D., Li, X., Panepucci, E., Samson, V. A., Sanchez, D. F., … & Leinenbach, C. (2017). 结合激光熔化和高速微X射线衍射原位研究增材制造条件下Ti-6Al-4V的相变。Scientific reports, 7(1), 16358。

Usamentiaga, R., Ibarra-Castanedo, C., Klein, M., Maldague, X., Peeters, J., & Sanchez-Beato, A. (2017). 使用红外热像技术对碳纤维自行车车架进行无损评估。Sensors, 17(11), 2679。

上层海洋 CTD 数据的温度图;由 Luz Zarate Jimenez 制作。

全水深取瓶数据的 pH 值图,其中点表示取瓶水样的深度;由 Luz Zarate Jimenez 制作。

WUNSCH, C. (2018). 旨在确定全球海洋热量、盐度和海面高程平均值的不确定性。Tellus A: Dynamic Meteorology and Oceanography, 70(1), 1-14。

来自中大西洋区域海岸海洋观测系统 (MARACOOS) 的滑翔机数据。
来自 tecplot 的海洋模型可视化。
Potter, H. (2018). 台风“查巴” (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) 的滑翔机数据。
ice¶
ice 色标是顺序的,从非常深的蓝色(几乎黑色)到非常浅的蓝色(几乎白色)。 इसका उपयोग समुद्री बर्फ के प्रतिनिधित्व के लिए किया जा सकता है।

Chad Greene 提供了一个示例,显示了南极洲周围海冰的浓度。
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% 在发散后为黄色,以突出过饱和水。此色标的最小值和最大值旨在控制,以便正确放置低氧和过饱和氧状态。此色标是为密西西比河羽流区域开发的,该区域经常出现并监测低氧和过饱和条件。

德克萨斯 A&M 大学物理海洋学数值小组 (PONG) 在墨西哥湾西北部的模型输出。使用底部氧气利用率的简单参数化模拟底部氧气,揭示了底部氧气的复杂结构。虽然受缺氧影响的区域沿陆架延伸近 400 公里,但在更小的尺度上(小至几公里)也存在变化。密西西比/阿查法拉亚河羽流的位置以及羽流中存在的不稳定性决定了缺氧底部水域的范围和结构。由德克萨斯 A&M 大学的Veronica Ruiz提供。

上层海洋 CTD 数据的氧气图;由 Luz Zarate Jimenez 制作。
deep¶
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). 固有过程驱动托滕冰川冰架基底融化中的变异性。Nature communications, 9(1), 3141。
dense¶
dense 色标是顺序的,低值为灰蓝色,随着值增加而变为紫色,可用于表示水密度增加。下面显示了此色标的两个示例,来自德克萨斯 A&M 大学滑翔机。此色标基于 matplotlib 的 Purples,但使用 viscm 工具从头创建。


上层海洋 CTD 数据的潜在密度图;由 Luz Zarate Jimenez 制作。
algae¶
algae 色标是顺序的,低值为灰绿色,随着值增加而变为绿色,可用于表示水中叶绿素的增加。下面显示了此色标的两个示例,来自德克萨斯 A&M 大学滑翔机。此色标基于 matplotlib 的 Greens,但使用 viscm 工具从头创建。

amp¶
amp 色标是顺序的,从灰白色到深红色,可用于表示波高值的增加。此色标是 balance 色标的正半部分。

地震震级,作者:Natalie Accardo,使用 GMT。

Baumgartner, B. L., O’Laughlin, R., Jin, M., Tsimring, L. S., Hao, N., & Hasty, J. (2018). 黄素代谢循环是单一酵母细胞生长和分裂的组成部分。Scientific reports, 8(1), 18045。
Lenhart, H. J., & Große, F. (2018). 使用跨界营养模型评估 WFD 营养减少在 OSPAR 框架内的影响。Frontiers in Marine Science, 5, 447。
Grunert, B. K., Brunner, S. L., Hamidi, S. A., Bravo, H. R., & Klump, J. V. (2018). 跨对比年份量化浅层沿海系统中的冷水入侵影响:密歇根湖绿湾。Journal of Great Lakes Research, 44(5), 851-863。
phase¶
phase 色标是循环的,在设定的亮度值下跨越所有色调。此色标旨在用于波相位和潮汐相位等特性,这些特性从 0° 环绕到 360° 再到 0°,并且应在色标中没有任何重大感知跳跃的情况下表示。

北大西洋潮汐相位,作者:Kristen Thyng。
balance¶
balance 色标是发散的,从深蓝色到偏白色再到深红色,分别代表负值、零值和正值;这可用于表示海面高程,其中海面高程的偏差以远离中性偏白色的色调表示。在这种情况下,选择红色调表示高于参考值(通常是平均海平面)的海面高程,这与通常与自由表面增加相关的较暖海水相关联,例如墨西哥湾的环流。此色标的一个示例来自德克萨斯州和路易斯安那州大陆架的数值模拟。此色标基于 matplotlib 的 RdBu,但使用 viscm 工具从头创建。


时空海洋学查询系统 (STOQS)
delta¶
delta 色标从深蓝色发散到偏白色,再通过黄绿色调,可用于表示围绕临界值(通常为零)发散的速度值。此色标的灵感来自Francesca Samsel的类似色标,但使用 viscm 工具从头生成。
tarn¶
tarn 色标是发散的,一侧是干燥的棕色调,另一侧是绿色和蓝色调。色标的正端旨在反映 rain 中的颜色,因此是 rain 的补充色标,用于表示降雨异常(围绕 0 或其他临界值)。
资源¶
以下是我最喜欢的一些资源。
cmocean 在其他地方可用!¶
- 适用于 MATLAB,作者:Chad Greene
- 适用于 R:Oce 海洋学分析包,作者:Dan Kelley 和 Clark Richards
- 适用于 Ocean Data Viewer
- 适用于通用绘图工具 (GMT):在 cpt-city 和 github 上
- 适用于 Paraview,灵感来自 Phillip Wolfram。
- 在 Plotly 中
- Chad Greene 的 南极地图工具 在 Matlab 中使用 cmocean
- 适用于 Tableau,作为 github 上的首选项文件
- 适用于 ImageJ,作为 LUTs 上的首选项文件
- 在 iGOTM 中,它模拟世界任何地方的水柱。
- cmocean 色标包含在以下软件包中
精美可视化示例:¶
为什么 jet 是一个糟糕的色标,以及如何选择更好的色标:¶
- 这是让我开始这一切的文章:工程师和科学家为什么要担心颜色?
- 由 Matteo Niccoli 撰写的一系列关于 jet 和选择色标的精彩文章,将真正教你所需的一切
- Jake Vanderplas 对反对 jet 的论点进行了很好的总结
- 美国气象学会公报 (BAMS) 中的一篇很好的总结,介绍了可视化研究和选择良好色标的工具,旨在用于大气研究但广泛适用。
- 此工具会将您的(小文件大小)图像转换为色盲人士看到的颜色,以便您更好地决定使用的颜色。
- 来自 matplotlib 绘图软件包网站的关于选择色标的文档。
- 选择良好科学色标的技巧
- 彩虹的终结,呼吁停止使用 jet。
- 研究表明 jet 对您的健康有害!
- 对先前研究的重新审查似乎显示视觉证据表明锋面实际上只是 jet 色标的伪影
SciPy 2014 和 2015 年会议上有一系列关于色标的讲座
- 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 at gmail.com 或在 Twitter 上@thyngkm。