最近在阅读文献时,想要复现别人的结果,其中遇到的一个挑战就是复现别人绘图时用的colorbar,本文分享一下我是如何复现的。
文献中的colorbar如下图所示:
想要复现这样的一条colorbar,首先需要观察一下它的颜色渐变分布。上图的colorbar还是比较清晰明了的,很容易发现它是这样渐变的:
蓝=>白=>黄=>红
blue - white -yellow -red
非常巧的是NCL的colormap中恰好有一条是这样分布的,作者估计就是根据这个改的:
这样就更方面了,我们在python中,先导入这一条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)
其中,简单对代码做一下说明:
NCL colormap
的一个库,非常感谢这个开发者的贡献对比结果如下所示:
可以发现,大致的特征已经比较一致了,稍加修饰即可成功完美复现原文的结果
同样的,既然可以从一个colormap中截取一部分作为新的colormap,那么可以将两个colormap拼接为一个新的colormap吗?
np.vstack()
函数,将两个colormap结果拼接,再重构为新的colormapcmap1=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
水平有限,欢迎指正!!!
欢迎评论、收藏、点赞、转发、关注。
关注我不后悔,记录学习进步的过程~~