在matplotlib中自定义colormap

colormap在imshow或者pcolor等画图函数中经常用到,它实际上是把数值映射到色彩,用色彩作为另外一个维度可视化数据。色彩的搭配经常决定了数据呈现的规律是否可以清楚地表示出来,对于标量场而言,通过色彩可以实现 f(x,y,z) 的可视化。最常见热力图就是这么画出来的。另外在很多领域,都需要表示数据在空间的分布。如何灵活搭配色彩称为可视化关键的问题。

例如最近需要画一些干涉图样,用到了imshow,但是默认的配色总是很难达到理想的状态,需要自己定义colormap,因此对matplotlib的颜色管理做了详尽的了解,下面从易到难介绍如何使用matplotlib中的色彩。

颜色的定义

在matplotlib中预定义了大量的颜色,如我们熟悉的简写‘b’代表blue,‘r’代表red,‘k’代表black等。除了这些色彩外,其实还有一些预定义的颜色可以参考下面的网页。

当然如果这些预定义的颜色也还不满足你的需求,在matplotlib中,任何设置color的地方,都可以使用RGB或者RGBA以及16进制表示颜色。以RGB为例,一般的RGB是三个0-255的数值组成,这里用0-1的小数表示,例如:

color=(0.5,0.5,0.5)

如果需要设置alpha值,可以写成四个元素的tuple。其它颜色的表示方法参考:

如果这里的色彩还不够用的话这里

有大量的颜色组合,使用也非常方便,并且可以通过mpl_colormap直接转化为colormap。相对于matplotlib颜色过于热烈,这里的颜色风格更符合目前的审美,即所谓的莫兰迪色。至于如何使用,后面举例说明。

内置colormap

matplotlib内置了大量已经搭配好的色彩,一如既往地色彩鲜明,搭配大红大绿,比较不符合如今的审美,例如下面这一组。

使用方法以imshow为例:

imshow(X,cmap='bwr')

就会用到bwr这种色彩搭配。这类中间为白色,两端深色的搭配 般叫做diverging。如果觉得以上色彩过于艳丽,一种替代方案就是使用seaborn或者Palettable中的方案。例如下面的配色,来自于 Palettable 中的cartocolors中的Sequential中的DarkMint_4,palettable下的色彩比较性冷淡,就没那么艳丽。

具体的使用方案是这样的,以转化为colormap为例:

from palettable.cartocolors.sequential import DarkMint_4
imshow(data, cmap=DarkMint_4.mpl_colormap)

自定义colormap

如果要使用自定义colormap,方案较多,各种方法具体请参考

这里提供一种最简单的方案使用 LinearSegmentedColormap.from_list函数。首先定义一组颜色,如下:

from pylab import *
from matplotlib.colors import ListedColormap,LinearSegmentedColormap
clist=['lightgrey','firebrick','lime']

接着将其转化为一种新的colormap:

newcmp = LinearSegmentedColormap.from_list('chaos',clist)

最后看一下效果:

当然这里重点不是看审美。特别是clist中的色彩完全可以用rgb或者是16进制,因此搭配方式会非常地多。

通过上面的了解,基本上可以调用已经存在的色彩,或者通过自定义的方式,实现更加合理的颜色搭配。

编辑于 2022-10-31 18:31

文章被以下专栏收录