前言
最近在阅读文献时,想要复现别人的结果,其中遇到的一个挑战就是复现别人绘图时用的colorbar,本文分享一下我是如何复现的。
文献中的colorbar如下图所示:
想要复现这样的一条colorbar,首先需要观察一下它的颜色渐变分布。上图的colorbar还是比较清晰明了的,很容易发现它是这样渐变的:
蓝=>白=>黄=>红 blue - white -yellow -red
非常巧的是NCL的colormap中恰好有一条是这样分布的,作者估计就是根据这个改的:
这样就更方面了,我们在python中,先导入这一条colormap,然后
- 重新定义一些区间范围,以及间隔
- 修改一些参数
即可完美实现相同的colormap。
之前也做过类似的教程分享:自定义colormap
截取colormap
下面是代码展示:
import numpy as np import cmaps import matplotlib.pyplot as plt import matplotlib as mpl from matplotlib.colors import ListedColormap #######################生成画板##################################### fig=plt.figure(figsize=(10,8),dpi=150) ax1=fig.add_axes([0,0,1,0.05]) ax2=fig.add_axes([0,0.25,1,0.05]) #######################定义新的colormap######################################### norm =mpl.colors.Normalize(vmin=-0.48, vmax=0.48) #确定colormap的最大最小值 cmap=cmaps.BlueWhiteOrangeRed #引用NCL的colormap newcolors=cmap(np.linspace(0,1,12))#分片操作,生成0到1的12个数据间隔的数组 newcmap=ListedColormap(newcolors[::1]) #重构为新的colormap ########################################################################### fc1=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap='BlueWhiteOrangeRed'), cax=ax1, orientation='horizontal', label='old cmap' , ticks=[-0.4,-0.32,-0.24,-0.16,-0.08,0,0.08,0.16,0.24,0.32,0.4] , extend='both') fc2=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=newcmap), cax=ax2, format='%.2g' , orientation='horizontal', label='new cmap' , ticks=[-0.4,-0.32,-0.24,-0.16,-0.08,0,0.08,0.16,0.24,0.32,0.4] , extend='both') fc2.ax.tick_params(which='major',direction='in',length=29)
其中,简单对代码做一下说明:
- cmaps 库是专门用来调用
NCL colormap
的一个库,非常感谢这个开发者的贡献 - ListedColormap 用来重构一个修改后的colormap
- 其他的代码都比较简单,对于colorbar的修饰
对比结果如下所示:
可以发现,大致的特征已经比较一致了,稍加修饰即可成功完美复现原文的结果
拼接colormap
同样的,既然可以从一个colormap中截取一部分作为新的colormap,那么可以将两个colormap拼接为一个新的colormap吗?
- 答案当然是可以的,实现的方法基本一致,无非是导入两个colormap而已
- 使用
np.vstack()
函数,将两个colormap结果拼接,再重构为新的colormap - 下面直接上代码和结果
cmap1=cmaps.MPL_Blues_r #蓝色 cmap2=cmaps.cmocean_algae #绿色 ########################################################################### list_cmap1=cmap1(np.linspace(0,1,13)) list_cmap2=cmap2(np.linspace(0,1,12)) new_color_list=np.vstack((list_cmap1,list_cmap2)) new_cmap=ListedColormap(new_color_list,name='new_cmap ') ########################################################################### fig=plt.figure(figsize=(10,8),dpi=200) ax1=fig.add_axes([0,0.15,1,0.03]) ax2=fig.add_axes([0,0.25,1,0.03]) ax3=fig.add_axes([0,0.35,1,0.03]) ########################################################################### norm =mpl.colors.Normalize(vmin=-10, vmax=10) fc1=fig.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmap1),cax=ax1, orientation='horizontal',extend='both', label='cmap1') fc2=fig.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmap2),cax=ax2, orientation='horizontal',extend='both', label='cmap2') fc3=fig.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=new_cmap),cax=ax3, orientation='horizontal',extend='both', label='newcmap')
结果如下所示:
可以发现还是非常perfect的,感兴趣的兄弟们快去尝试吧~
一个努力学习python的ocean er 水平有限,欢迎指正!!! 欢迎评论、收藏、点赞、转发、关注。 关注我不后悔,记录学习进步的过程~~