python 分享一个复现文献中colorbar的简单教程

简介: 最近在阅读文献时,想要复现别人的结果,其中遇到的一个挑战就是复现别人绘图时用的colorbar,本文分享一下我是如何复现的。

前言



最近在阅读文献时,想要复现别人的结果,其中遇到的一个挑战就是复现别人绘图时用的colorbar,本文分享一下我是如何复现的。


文献中的colorbar如下图所示:


c6f31e9be3df4ed7962049ed3e80c9af.png


想要复现这样的一条colorbar,首先需要观察一下它的颜色渐变分布。上图的colorbar还是比较清晰明了的,很容易发现它是这样渐变的:


蓝=>白=>黄=>红
blue - white -yellow -red


非常巧的是NCL的colormap中恰好有一条是这样分布的,作者估计就是根据这个改的:


dbfe3fabcf464991bda340257e14d33e.png


这样就更方面了,我们在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的修饰


对比结果如下所示:


882b90c5cf094431b08e05a2c9fa28e9.png


可以发现,大致的特征已经比较一致了,稍加修饰即可成功完美复现原文的结果


拼接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') 


结果如下所示:


12ff6957358842fda3fa9fe0cf853ae0.png


可以发现还是非常perfect的,感兴趣的兄弟们快去尝试吧~


                    一个努力学习python的ocean er
                      水平有限,欢迎指正!!!
                      欢迎评论、收藏、点赞、转发、关注。
                      关注我不后悔,记录学习进步的过程~~
相关文章
|
3天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
30 8
|
3天前
Seaborn 教程-主题(Theme)
Seaborn 教程-主题(Theme)
22 7
|
3天前
|
Python
Seaborn 教程-模板(Context)
Seaborn 教程-模板(Context)
22 4
|
3天前
|
数据可视化 Python
Seaborn 教程
Seaborn 教程
20 5
|
26天前
|
Python
SciPy 教程 之 Scipy 显著性检验 9
SciPy 教程之 Scipy 显著性检验第9部分,介绍了显著性检验的基本概念、作用及原理,通过样本信息判断假设是否成立。着重讲解了使用scipy.stats模块进行显著性检验的方法,包括正态性检验中的偏度和峰度计算,以及如何利用normaltest()函数评估数据是否符合正态分布。示例代码展示了如何计算一组随机数的偏度和峰度。
24 1
|
27天前
|
BI Python
SciPy 教程 之 Scipy 显著性检验 8
本教程介绍SciPy中显著性检验的应用,包括如何利用scipy.stats模块进行显著性检验,以判断样本与总体假设间的差异是否显著。通过示例代码展示了如何使用describe()函数获取数组的统计描述信息,如观测次数、最小最大值、均值、方差等。
27 1
|
28天前
|
数据采集 数据可视化 数据挖掘
深入浅出:使用Python进行数据分析的基础教程
【10月更文挑战第41天】本文旨在为初学者提供一个关于如何使用Python语言进行数据分析的入门指南。我们将通过实际案例,了解数据处理的基本步骤,包括数据的导入、清洗、处理、分析和可视化。文章将用浅显易懂的语言,带领读者一步步掌握数据分析师的基本功,并在文末附上完整的代码示例供参考和实践。
|
28天前
|
Python
SciPy 教程 之 Scipy 显著性检验 6
显著性检验是统计学中用于判断样本与总体假设间是否存在显著差异的方法。SciPy的scipy.stats模块提供了执行显著性检验的工具,如T检验,用于比较两组数据的均值是否来自同一分布。通过ttest_ind()函数,可以获取两样本的t统计量和p值,进而判断差异是否显著。示例代码展示了如何使用该函数进行T检验并输出结果。
26 1
|
29天前
|
Python
SciPy 教程 之 Scipy 显著性检验 3
本教程介绍Scipy显著性检验,包括其基本概念、原理及应用。显著性检验用于判断样本与总体假设间的差异是否显著,是统计学中的重要工具。Scipy通过`scipy.stats`模块提供了相关功能,支持双边检验等方法。
27 1
|
1月前
|
机器学习/深度学习 Python
SciPy 教程 之 SciPy 插值 2
SciPy插值教程:介绍插值概念及其在数值分析中的应用,特别是在处理数据缺失时的插补和平滑数据集。SciPy的`scipy.interpolate`模块提供了强大的插值功能,如一维插值和样条插值。通过`UnivariateSpline()`函数,可以轻松实现单变量插值,示例代码展示了如何对非线性点进行插值计算。
25 3