前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python可视化 | xarray 二维绘图配色方案设置

Python可视化 | xarray 二维绘图配色方案设置

作者头像
郭好奇同学
发布2021-07-30 14:57:12
4.3K0
发布2021-07-30 14:57:12
举报
文章被收录于专栏:好奇心Log

封图:Photo by Alexander Ant on Unsplash

绘图配色方案设置

导入本节所需的包

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr

顺接上期时间变化图的内容,本期考虑绘图配色方案的设置。

代码语言:javascript
复制
ds.Tair.isel(lon=1).plot(
    x="time",
    robust=True,
    cbar_kwargs={
        "orientation": "horizontal",
        "label": "custom label",
        "pad": 0.25,
    },
)

默认配色方案viridis

更改配色方案可需更改参数cmap(colormaps). xarray 绘图模块默认对全正/负数据采用viridis(顺序配色)配色方案,而对含正和负的数据采用RdBu_r(互逆配色). 下面尝试更改上述绘图的配色方案为Spectral.

代码语言:javascript
复制
ds.Tair.isel(lon=1).plot(
    x="time",
    robust=True,
    cmap = "Spectral",
    cbar_kwargs={
        "orientation": "horizontal",
        "label": "custom label",
        "pad": 0.25,
    },
)

配色方案:Spectral

若颠倒配色方案颜色顺序,需在参数cmap配色方案中的名称后部添加_r,如Spectral_r.

代码语言:javascript
复制
ds.Tair.isel(lon=1).plot(
    x="time",
    robust=True,
    cmap = "Spectral_r",
    cbar_kwargs={
        "orientation": "horizontal",
        "label": "custom label",
        "pad": 0.25,
    },
)

配色方案:Spectral_r

Matlibplot 配色方案

Matlibplot 内置配色方案大致可分为三类。对 Matlibplot 配色方案的使用,需将参数cmap赋值为对应名称的字符串形式,如cmap = Purples.

  1. 感知统一顺序配色方案(Perceptually uniform sequential colormaps):一般由可辨别、与数据之间成正比的两种颜色组成。更多细节可参考ColorCET: Perceptually Uniform Colour Maps[1].
  1. 顺序配色方案(Sequential colormaps):一般是一组连续颜色所组成的配色方案,如Purples.
  1. 互逆配色方案(Diverging colormaps):一般由两组互补的颜色所组成,表示数据相反的两个部分,如RdBu.
  1. 周期配色方案(Cyclic colormaps):一般开始和结束的颜色是一样的,色调变化尽可能平滑。
  1. 定性配色方案(Qualitative colormaps):一般是具有随机顺序的颜色,以便能够区分不同数据。如Pastel1.
  1. 杂项(Miscellaneous)

Matlibplot 2.0 之前的版本曾将jet作为默认的配色方案,但该配色方案很容易出现因图形亮度接近而致使颜色无法分辨的问题。

可明显看到两个亮度极值中心

当前 Matlibplot 默认配色方案为viridis.

可注意两个高亮区间的亮度十分接近,不易识别数据差异。基于此,感知统一顺序配色方案便成为很好的选择。该配色方案充分考虑亮度渐变。不仅易于观察,也易于其灰度图的转换。

viridis

若习惯使用彩虹色,而又避免亮度问题,cubehelix配色方案是一个不错的选择。

cubehelix

如需直接查看配色方案情况,可通过内置函数plt.get_cmap查看

代码语言:javascript
复制
plt.get_cmap("viridis")

plt.get_cmap("viridis")

Matlibplot 配色方案更多细节可参考Choosing Colormaps in Matplotlib[2].

Seaborn 配色方案

seaborn 包提供了比较好的配色方案,xarray 可通过接口直接使用。seaborn 包可通过 PyPi 安装。

代码语言:javascript
复制
pip install seaborn # 安装seaborn

在使用Seaborn 配色方案[3]之前,需引入 Seaborn 包。

代码语言:javascript
复制
import seaborn as sns

seaborn 包的配色方案如下。

  1. 感知统一顺序配色方案
  • rocket
  • rocket_r(下同)
  • mako
  • flare
  • crest
  1. 互逆配色方案
  • vlag
  • icefire

NCL 配色方案

NCL(NCAR Command Language)[4] 是一门过去广泛应用于气象领域绘图的语言,其配色方案可参见Color Table Gallery[5].

Color Table Gallery

cmaps包提供了访问 NCL 中配色方案的方法,可通过 Pypi 或 conda-forge 安装。

代码语言:javascript
复制
pip install cmaps
# 或 conda install -c conda-forge cmaps

倘若设置配色方案为ncl_default,那么参数cmap需赋值为cmaps.ncl_default. 其余类似的同理。

ncl_default配色方案

代码语言:javascript
复制
import cmaps # 导入cmaps包

ds.Tair.isel(lon=1).plot(
    x="time",
    robust=True,
    cmap = cmaps.ncl_default,
    cbar_kwargs={
        "orientation": "horizontal",
        "label": "custom label",
        "pad": 0.25,
    },
)

配色方案:ncl_default

使用 CMasher 包处理配色方案

在科学研究过程中,数据的呈现常常会使用各类颜色。颜色提供了一个新的维度,以便能在同一张图上呈现出更多、更复杂的数据,而无需考虑三维图、子图、交互图。然而许多时候对颜色如何影响可视化数据的解释往往是低估的,很多时候错误的绘制会给读者带来困扰,因此选择正确的颜色是至关重要的。CMasher 包[6] 提供了一个平台,能够帮助更好地选择颜色,可通过 PyPi 或者 conda-forge 安装。

代码语言:javascript
复制
pip install cmasher
# conda install -c conda-forge cmasher

https://doi.org/10.21105/joss.02004

CMasher 内置配色方案

CMasher 内置配色方案的使用需在方案名称前添加cmr.,如cmr.wildfire.

代码语言:javascript
复制
import cmasher as cmr # 导入CMasher包

ds.Tair.isel(lon=1).plot(
    x="time",
    robust=True,
    cmap = "cmr.wildfire",
    cbar_kwargs={
        "orientation": "horizontal",
        "label": "custom label",
        "pad": 0.25,
    },
)

CMasher 有如下配色方案:

  1. 顺序配色方案
  1. 互逆配色方案
  1. 周期配色方案

获取子配色方案

绝大多数 CMasher 内置顺序配色方案的亮度范围是从黑至白的,因为在这样的亮度变化下可获得最佳的色彩感知效果,但有时候并非我们想要的。CMasher 中可通过函数cmr.get_sub_cmap()[7]提取配色方案中的部分颜色。

若获取配色方案viridis距中心 70%(

0.85-0.15=0.7

)的新配色方案:

代码语言:javascript
复制
myviridis = cmr.get_sub_cmap('viridis', 0.15, 0.85)
cmr.view_cmap(myviridis, show_grayscale=True)

myviridis

cmr.get_sub_cmap()第一个参数即为配色方案(Colormap对象),第二、三个参数为配色方案标准化范围(数值范围为 0~1).

为了避免新配色方案颜色太少而致使颜色不够平滑,一般需包含至少 128 种不同颜色。这就意味着连续配色方案的新配色方案至少应距中心 50% (256 色),而互逆/周期配色方案应至少距中心 25% (511/510 种颜色).

当然 CMasher 包的函数cmr.get_sub_cmap()可进一步对配色方案离散化。比如离散距中心 60% cmr.lilac配色方案为 5 份

代码语言:javascript
复制
mylilac = cmr.get_sub_cmap('cmr.lilac', 0.2, 0.8, N=5)
cmr.view_cmap(mylilac, show_grayscale=True)

mylilac

查看配色方案可通过cmr.view_cmap[8]实现,类似于 Matlibplot 中的函数plt.get_cmap. 这个函数有两个参数:show_testshow_grayscale.

函数plt.get_cmap仅可查看 Matlibplot 中的配色方案,不能查看 CMasher 中的配色方案;而cmr.view_cmap对两者的配色方案均可查看。

  • show_test:控制是否显示配色方案测试。
  • show_grayscale:控制是否显示配色方案的灰度版本。
代码语言:javascript
复制
cmr.view_cmap('viridis', show_grayscale=True)
代码语言:javascript
复制
cmr.view_cmap('jet', show_test=True, show_grayscale=True)

配色方案测试的细节可参见 arXiv 计算机科学图形领域的文章——Good Colour Maps: How to Design Them (Peter Kovesi, 2015)[9]和 MATLAB 博客——Colormap Test Image[10]

Good Colour Maps: How to Design Them

Colormap Test Image

如何合理选择配色方案可参考计算生物学《PLOS COMPUTATIONAL BIOLOGY》OA 文章——Ten Simple Rules for Better Figures (Nicolas P. Rougier 等, 2014)[11]

Ten Simple Rules for Better Figures

参考资料

[1]

ColorCET: Perceptually Uniform Colour Maps: https://colorcet.com/

[2]

Choosing Colormaps in Matplotlib: https://matplotlib.org/stable/tutorials/colors/colormaps.html#choosing-colormaps-in-matplotlib

[3]

Seaborn 配色方案: http://seaborn.pydata.org/tutorial/color_palettes.html

[4]

NCL(NCAR Command Language): https://www.ncl.ucar.edu/

[5]

Color Table Gallery: http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml

[6]

CMasher包: https://cmasher.readthedocs.io/

[7]

cmr.get_sub_cmap(): https://cmasher.readthedocs.io/api/cmasher.html#cmasher.get_sub_cmap

[8]

cmr.view_cmap: https://cmasher.readthedocs.io/api/cmasher.html#cmasher.view_cmap

[9]

Good Colour Maps: How to Design Them (Peter Kovesi, 2015 : https://arxiv.org/abs/1509.03700

[10]

Colormap Test Image: https://blogs.mathworks.com/steve/2017/07/24/colormap-test-image/

[11]

Ten Simple Rules for Better Figures (Nicolas P. Rougier等, 2014 : https://doi.org/10.1371/journal.pcbi.1003833

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 好奇心Log 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 绘图配色方案设置
    • Matlibplot 配色方案
      • Seaborn 配色方案
        • NCL 配色方案
          • 使用 CMasher 包处理配色方案
            • CMasher 内置配色方案
            • 获取子配色方案
            • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档