This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.
女朋友说想画一个非对称的Colormap的图出来(也即0还是对应于白色,但是两侧的数值范围是不一样的),于是就研究了一下,最后的效果如下
解决思路
matplotlib里面原本的RdBu_r
之类的颜色条两侧的颜色是对称的。在stack overflow上找到的高赞回答使用的函数DivergingNorm
再大于3.2
版本的matplotlib中已经无法使用了,重命名后的函数TwoSlopeNorm
实测也做不出一样的效果。唯一的解决方法就是自己重新定义一个Colormap。matplotlib里面的Colormap有两类,一类是ListedColormap
,画出来是离散的;一类是LinearSegmentedColormap
,画出来是连续的。这里创建出来的非对称Colormap使用的是LinearSegmentedColormap
。
为了创建出Colormap我们需要自己定义出所用颜色的RGBA的值,获得的方法就是先将颜色条显示的值映射到索引[0, 1, 2, ..., 255]
中,再利用映射后得到的索引取出对应的RGBA的值。由于我们想让0对应的颜色是白色(索引值127),因此0两侧的值是需要分开进行映射的。代码如下
1 | import matplotlib as mpl |
最后使用新创建的new_RdBu_r
绘制图像,就能得到想要的效果了。contourf
函数也能使用,画出离散的非对称颜色条。
Author: Syize
Permalink: https://blog.syize.cn/2023/10/20/asymmetrical-colormap/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Syizeのblog!
Comments