美丽的海洋学色图: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 色图的一些属性。我们可以看到,该色图在灰度打印中表现良好,在整个色图中具有一致的感知增量,并且对色盲人士具有良好的可视性。它在 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)]}
根据 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])

您可以按百分比裁剪色图的一端。例如,如果您不考虑超饱和条件(色图的顶部 20%),您可以将 oxy 色图的顶部裁剪掉,操作如下:
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。

由 Luz Zarate Jimenez 绘制的表层海洋 CTD 数据温度图。

由 Luz Zarate Jimenez 绘制的全水深瓶装水数据 pH 值图,其中点代表收集瓶装水样的深度。

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 工具从头创建。

由 Clark Richards 使用 R oce 包绘制的 CTD 数据(温度和盐度)。

由 Luz Zarate Jimenez 绘制的全水深瓶装水数据碱度图,其中点代表收集瓶装水样的深度。

由 Luz Zarate Jimenez 绘制的表层海洋 CTD 数据盐度图。
来自中大西洋区域协会沿海海洋观测系统 (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% 在发散后呈黄色,以突出过饱和水体。该色图的最小值和最大值旨在进行控制,以便正确放置低氧和过饱和氧状态。该色图是为密西西比河羽流区域开发的,该区域经常观察和监测到低氧和过饱和条件。

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

由 Luz Zarate Jimenez 绘制的表层海洋 CTD 数据氧气图。
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 工具从头创建。


由 Luz Zarate Jimenez 绘制的表层海洋 CTD 数据潜在密度图。
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 在其他地方可用!¶
- 由 Chad Greene 为 MATLAB 提供
- 为 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 色图的伪影。
在 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 at gmail.com 或 Twitter:@thyngkm。