本节提要:这一篇文章主要是解决色条(colorbar)在使用中的一些问题,虽然不能说面面俱到,但仍然略有裨益于读者。



一、色条Colorbar的基础

在我们绘制有色阶的图片时,多会用到colorbar这个关联利器,色条可以直接将数值与颜色连接在一起。常用的scatter、contourf是非常适合使用的。第一节我们来简要谈谈常用的colorbar参数,以后例子都基于contourf命令。

第一个参数为colorbar传入参数,代表colorbar所关联的contourf,这种方式是最简单的默认传入,绘制出来的colorbar和cf是相匹配的,展示的也是cf的信息。

cf=ax.contourf(... ...)fig.colorbar(cf)

第二个参数为colorbar绘制的默认子图位置参数,代表当前这个colorbar将要摆放的子图位置。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.ticker as mtickerplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False#负号def data():    datax=np.linspace(-10,10,200)    datay=np.linspace(-10,10,200)    X,Y=np.meshgrid(datax,datay)    Z=np.sqrt(X**2+Y**2)    return X,Y,Zx,y,z=data()fig=plt.figure(figsize=(5,2),dpi=500)ax1=fig.add_axes([0,0,0.4,1])ax1.set_title('ax1')acf1=ax1.contourf(x,y,z)ax2=fig.add_axes([0.5,0,0.4,1])ax2.set_title('ax2')acf2=ax2.contourf(x,y,z,cmap='Spectral_r')fig.colorbar(acf1,ax=ax2)

在上面这段程序中最后一句,fig.colorbar(acf1,ax=ax2),虽然我们传入了acf1即ax1里的等值线,但是我们指定colorbar中ax=ax2,所以绘制出来的colorbar将被放置在ax2旁边。

第三个为指定色条位置参数cax,我们放在后面专开一节讲。

第四个为使色条展示尖角的参数extend,他可以使色条展现出角的形状,其可选命令both表示两头都变尖,max表示数值大的那头变尖,min表示小的那头变尖。

cf=ax.contourf(x,y,z,extend='both')fig.colorbar(cf,extend='both')

第五个参数为缩放参数shrink,从0-1,色条将会按照输入值被缩放:

cf=ax.contourf(x,y,z)fig.colorbar(cf,shrink=0.5)

第六个参数为距离参数pad,该参数控制色条与子图的间距:

cf=ax.contourf(x,y,z)fig.colorbar(cf,pad=0.005)

第七个为色条方向参数orientation,控制色条时横纵方向,当为horizontal时,色条将被平放在下方:

cf=ax.contourf(x,y,z)fig.colorbar(cf,orientation='horizontal')

第八个为ticks,你可以传入一个列表,显示你想展示的刻度,其他刻度将消失。类似于ax.set_yticks( ).

cf=ax.contourf(x,y,z)fig.colorbar(cf,ticks=[0,2,4,16])

第九个为format,用于控制色条上刻度的格式,比如将其保留两位小数:

cf=ax.contourf(x,y,z)fig.colorbar(cf,format='%.2f')

第十个为label,简单的给色条一个标签:

cf=ax.contourf(x,y,z)fig.colorbar(cf,label='色条')

当然,上面的都是最为基础的参数,你还可以进一步的做美化,其中,最常用的就是将色条作为一个子图来进行操作。

cf=ax.contourf(x,y,z)fc=fig.colorbar(cf)#使用fc省称ax2=fc.ax#调出colorbar的ax属性ax2.set_title('这是色条的标题',fontsize=5)ax2.tick_params(which='major',direction='in',labelsize=4,length=7.5)ax2.tick_params(which='minor',direction='in')ax2.yaxis.set_minor_locator(mticker.MultipleLocator(0.5))#显示x轴副刻度

接下来就要讲一讲关于cax的应用了,这个参数在fig.add_axes下特别好用,可以实现非常棒的色条插入效果。从前面简单的参数来看,colorbar自身很难实现在多子图之间挪动,而cax则可以轻松实现。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.ticker as mtickerplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False#负号def data():    datax=np.linspace(-10,10,200)    datay=np.linspace(-10,10,200)    X,Y=np.meshgrid(datax,datay)    Z=np.sqrt(X**2+Y**2)    return X,Y,Zx,y,z=data()fig=plt.figure(figsize=(5,3),dpi=500)ax1=fig.add_axes([0,0.3,0.4,0.7])ax1.set_title('ax1')acf1=ax1.contourf(x,y,z)ax2=fig.add_axes([0.5,0.3,0.4,0.7])ax2.set_title('ax2')acf2=ax2.contourf(x,y,z)ax3=fig.add_axes([0.2,0.17,0.5,0.05])fig.colorbar(acf1,cax=ax3,orientation='horizontal')

将上面这幅图与本文第一张图比较,如果使用fig.colorbar直接生成色条,那么图像上将会有两个子图,生成的colorbar不算子图。而cax方式相当于有三个子图,ax1,ax2与ax3,其中ax3用来存放色条。而只要更改添加子图的位置参数,就可以在图上随意移动。这在多子图上添加规范色条时非常方便。

关于指数标签,一般来说,在contourf中使用了指数标签命令后,色条会自动变成指数模式。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.ticker as mtickerfrom matplotlib.colors import LogNormplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False#负号def data():    datax=np.linspace(-10,10,200)    datay=np.linspace(-10,10,200)    X,Y=np.meshgrid(datax,datay)    Z=np.sqrt(X**2+Y**2)    return X,Y,Zx,y,z=data()fig=plt.figure(figsize=(2.6,2),dpi=500)ax=fig.add_axes([0,0,1,1])cf=ax.contourf(x,y,z*100,norm=LogNorm())###在这里有不同fc=fig.colorbar(cf)ax2=fc.axax2.set_title('指数色条',fontsize=5)ax2.tick_params(which='major',direction='in',labelsize=4,length=7.5)ax2.tick_params(which='minor',direction='in')ax.set_title('使用指数标签')

接下来,是一些比较没多大用处,但很有意思的colorbar操作。

一、如何使色条两侧各有一种刻度

比如这张图的色条,左边是数值刻度,右边是文字刻度。当然,两边是否对称,是否数值文字都取决于你的设置,你还可以做出螺旋上升的色条标签。

import numpy as npfrom matplotlib.colors import Normalizeimport matplotlib as mplimport pandas as pdimport cartopy.crs as ccrsimport cartopy.feature as cfeatfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTERfrom cartopy.io.shapereader import Readerfrom scipy.interpolate import Rbfimport matplotlib.pyplot as pltimport matplotlib.ticker as mtickerimport syssys.path.append(r"C:\Users\lenovo\Desktop")import maskoutplt.rcParams['font.sans-serif']=['SimHei']extent=[108.2,110.8,29.1,31.401]proj= ccrs.PlateCarree() fig = plt.figure(figsize=(7, 10),dpi=500)  ax = fig.subplots(1, 1, subplot_kw={'projection': proj})  reader = Reader(r'E:\家园\区划-省界\恩施.shp')cities = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='k', facecolor='none')ax.add_feature(cities, linewidth=0.7)ax.set_extent(extent, crs=proj)gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,linewidth=0.7, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = False gl.ylabels_right = False gl.xformatter = LONGITUDE_FORMATTER gl.yformatter = LATITUDE_FORMATTER gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1]+0.5, 0.4))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3]+0.5, 0.4))gl.xlabel_style={'size':10}gl.ylabel_style={'size':10}    ###############################以下为添加县市名称和点########################################nameandstation={"恩施":[109.5,30.2],"利川":[109,30.3],"巴东":[110.34,31.04],"建始":[109.72,30.6],"宣恩":[109.49,29.987],"来凤":[109.407,29.493],"咸丰":[109.14,29.665],"鹤峰":[110.034,29.89]}for key,value in nameandstation.items():    ax.scatter(value[0] , value[1] , marker='.' , s=90 , color = "k" , zorder = 3)    ax.text(value[0]-0.07 , value[1]+0.03 , key , fontsize = 12 , color = "k")    ##############################################读取文件打包数据###########################################filename=r'C:\Users\lenovo\Desktop\累年降水数据.xlsx'#数据文件地址,这个数据是我捏造的,没有实际意义df=pd.read_excel(filename)#读取文件lon=df['lon']#读取站点经度lat=df['lat']#读取站点纬度rain=df['precipitation']#读取站点累计年降水量olon=np.linspace(108,111,30)#设置网格经度olat=np.linspace(29,32,30)#设置网格纬度olon,olat=np.meshgrid(olon,olat)#网格化func=Rbf(lon,lat,rain,function='linear')#定义插值函数rain_new=func(olon,olat)#获得插值后的网格累计降水量cs= ax.contourf(olon,olat,rain_new,levels=np.arange(900,2000,100),cmap='GnBu',extend='both')#画图clip=maskout.shp2clip(cs, ax,r'E:\enshi\恩施.shp' ,0) plt.title('恩施州去年累计降水',size=20)##########################################################################################position=fig.add_axes([0.97,0.25,0.04,0.5])cb=fig.colorbar(cs,cax=position,shrink=0.4,extend='both')#绘制colorbar并省称为cbax2=cb.ax#召唤出cb的ax属性并省称为ax2,这时ax2即视为一个子图ax2.yaxis.set_ticks_position('left')#将数值刻度移动到左侧ax2.tick_params(labelsize=10,left=True,right=True)#修改刻度样式,并使左右都有刻度ax3=ax2.secondary_yaxis('right')#新建ax3,使ax3与ax2完全相同ax3.spines['right'].set_bounds(900,1900)#截去多余的部分ax3.set_yticks([900,1100,1300,1500,1700,1900])ax3.set_yticklabels(['缺水','一般性缺水','收支充足','降水丰沛','有可能涝灾','成灾'])#将ax3上的定量数值转化为定性文字

我在文章里插入了读者讨论,貌似可以充当互动,有问题可以直接留言,也可以后台留言。

二、如何实现colorbar与其他子图的互动操作

这个是好像有一位小伙伴问过的,于是简单的做了一个,使折线图与色条在视觉上共用一个坐标轴(实际上是没有的)。

import numpy as npfrom matplotlib.colors import Normalizeimport matplotlib as mplimport pandas as pdimport cartopy.crs as ccrsimport cartopy.feature as cfeatfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTERfrom cartopy.io.shapereader import Readerfrom scipy.interpolate import Rbfimport matplotlib.pyplot as pltimport matplotlib.ticker as mtickerimport syssys.path.append(r"C:\Users\lenovo\Desktop")import maskoutplt.rcParams['font.sans-serif']=['SimHei']extent=[108.2,110.8,29.1,31.401]proj= ccrs.PlateCarree() fig = plt.figure(figsize=(7, 5),dpi=500)  ax = fig.add_axes([0,0,0.6,1],projection=proj)reader = Reader(r'E:\家园\区划-省界\恩施.shp')cities = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='k', facecolor='none')ax.add_feature(cities, linewidth=0.7)ax.set_extent(extent, crs=proj)gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,linewidth=0.7, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = False gl.ylabels_right = False gl.xformatter = LONGITUDE_FORMATTER gl.yformatter = LATITUDE_FORMATTER gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1]+0.5, 0.4))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3]+0.5, 0.4))gl.xlabel_style={'size':10}gl.ylabel_style={'size':10}    ###############################以下为添加县市名称和点########################################nameandstation={"恩施":[109.5,30.2],"利川":[109,30.3],"巴东":[110.34,31.04],"建始":[109.72,30.6],"宣恩":[109.49,29.987],"来凤":[109.407,29.493],"咸丰":[109.14,29.665],"鹤峰":[110.034,29.89]}for key,value in nameandstation.items():    ax.scatter(value[0] , value[1] , marker='.' , s=90 , color = "k" , zorder = 3)    ax.text(value[0]-0.07 , value[1]+0.03 , key , fontsize = 12 , color = "k")    ##############################################读取文件打包数据###########################################filename=r'C:\Users\lenovo\Desktop\累年降水数据.xlsx'#数据文件地址df=pd.read_excel(filename)#读取文件lon=df['lon']#读取站点经度lat=df['lat']#读取站点纬度rain=df['precipitation']#读取站点累计年降水量olon=np.linspace(108,111,30)#设置网格经度olat=np.linspace(29,32,30)#设置网格纬度olon,olat=np.meshgrid(olon,olat)#网格化func=Rbf(lon,lat,rain,function='linear')#定义插值函数rain_new=func(olon,olat)#获得插值后的网格累计降水量cs= ax.contourf(olon,olat,rain_new,levels=np.arange(900,2000,100),cmap='GnBu')#画图clip=maskout.shp2clip(cs, ax,r'E:\enshi\恩施.shp' ,0)#白化 plt.title('恩施州去年累计降水',size=20)##########################################################################################position=fig.add_axes([0.66,0.13,0.03,0.74])#添加子图用来存放色条cb=fig.colorbar(cs,cax=position,shrink=0.4)#绘制colorbar并省称为cbax2=cb.ax#召唤出cb的ax属性并省称为ax2,这时ax2即视为一个子图ax2.yaxis.set_ticks_position('left')#将数值刻度移动到左侧ax2.tick_params(which='both',labelsize=10,left=True,direction='in')#修改刻度样式,并使左右都有刻度ax2.yaxis.set_minor_locator(mticker.MultipleLocator(50))#############################################################################################ax3=fig.add_axes([0.69,0.13,0.25,0.74])ax3.tick_params(which='both',direction='in',left=False,right=False)ax3.yaxis.set_ticks_position('right')#将数值刻度移动到左侧ax3.yaxis.set_major_locator(mticker.NullLocator())#去掉y轴坐标ax3.xaxis.set_minor_locator(mticker.MultipleLocator(100))#显示x轴副刻度ax3x=np.array([200,400,800,1400,1200,900,700,450,200,100])ax3y=np.arange(900,1900,100)ax3.plot(ax3x,ax3y)ax3.set(title='累计降水分布面积',xlim=(0,1500),xlabel='分布面积(平方千米)')

以上数据和各种标准都是我虚构的,没有实际意义。

三、不等距的色条

这是matplotlib官网上的一个例子,比较有意思,于是就搬过来了。基本上照源代码修改就能用了。

position=fig.add_axes([0.9,0,0.05,1])cmap = mpl.colors.ListedColormap(colordict)cmap.set_over('0.25')cmap.set_under('0.75')bounds = colorlevelnorm2 = mpl.colors.BoundaryNorm(bounds, cmap.N)fig.colorbar(    mpl.cm.ScalarMappable(cmap=cmap, norm=norm2),    cax=position,    boundaries=[0] + bounds + [501],     extend='both',    ticks=bounds,    spacing='proportional')

感谢阅读!

欢迎关注云台书使关注获取更多

中设置colorbar_气象绘图加强版(六)—Colorbar相关推荐

  1. 中设置colorbar_【值得收藏】如何画出学术论文中需要的各种精美插图,看这一篇就够了!...

    本文整理自知乎问答,仅用于学术分享,著作权归作者所有.如有侵权,请联系后台作删文处理. 方法一 作者|冯昱尧 https://www.zhihu.com/question/21664179/answe ...

  2. 【Python气象绘图临摹】图像绘制(下):地理子图GeoAxes、xy轴设置、应用ncl色阶colormap、各标题、海岸线、添加文本、添加矩形框

    文章目录 前言 plt.fig.ax.三者绘制区别: GeoAxes地图投影:绘图投影和数据投影 x轴.y轴设置: 多个子图之间的间距调节: 图上添加文本.矩形框: python中ncl色阶color ...

  3. pcl如何设置colorbar_突然加更 | 子图、colorbar和标题

    画子图的教程网上一搜一大堆,不过我在画的时候还是出了点奇奇怪怪的问题,依然是聊一聊我遇到的问题,尽管最终呈现效果还行,但是还是被几个小问题卡住了,比如共用坐标轴设置了跟没设置一样,之后再找找大佬问一下 ...

  4. PyQT5 (四十六) 在 QTableWidget 表格中设置合并单元格 的案例

    在 QTableWidget 表格中设置合并单元格 的案例 setSpan(row, col, 要合并的行数, 要合并的列数) import sysfrom PyQt5 import QtPrintS ...

  5. Word控件Spire.Doc 【段落处理】教程(六):如何在word文档中设置段落间距

    段落是word文档中非常重要的元素.它功能强大并且具有许多特性.Spire.Doc 是专为开发人员设计的 .NET 组件,可让您轻松灵活地操作段落. Spire.Doc for.NET 最新下载htt ...

  6. python代码画皮卡丘_Python气象绘图实例我们一起画台风(代码+数据)

    前段时间袭击中国的超强台风"利奇马",以及这两天袭击美国的五级飓风"多利安",让我们感受到了大自然的力量.所以,今天分享一个简单的Python实例,也算是延续前 ...

  7. python色标_Python: 气象绘图实例之台风

    前段时间袭击中国的超强台风"利奇马",以及这两天袭击美国的五级飓风"多利安",让我们感受到了大自然的力量.所以,今天分享一个简单的Python实例,也算是延续前 ...

  8. python绘制剖面图_Python气象绘图教程—(十九)剖面图

    本节提要:简要谈谈地形剖面图.纬度高度剖面图.时间纬度图的绘制方法. 提要中提到的这几种图形都是在气象上比较常用的,地形剖面主要研究地貌对降雨.气流的影响作用:纬度高度剖面图可以用来分析降雨的某些条件 ...

  9. python绘图库_利用python中的绘图库绘图的方法介绍

    matplotlib是Python最著名的绘图库,本文给大家分享了利用matplotlib+numpy绘制多种绘图的方法实例,其中包括填充图.散点图(scatter plots).. 条形图(bar ...

最新文章

  1. 周三多管理学第七版pdf_考研(管理学)相对好考的211院校推荐
  2. 《搬砖日记》Obi Rope插件的简单使用
  3. Linux C 串口属性设置
  4. mysql 引擎 校对,MySQL 字符集和校对
  5. kali linux子远程桌面,适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )...
  6. vue 3.2 的 script setup 语法
  7. opencv移植到ubuntu
  8. ACL2020 | SongNet(格式可控的文本生成)
  9. 五级流水线CPU之低功耗设计 (一) :Bypassing(旁路)
  10. python输出姓名和成绩用函数_函数练习
  11. 如何实现 iOS 短视频跨页面的无痕续播?
  12. 多校2.1012La Vie en rose
  13. 华为手机无法进入开发者模式
  14. 作文指导百法·9.从阅读中积累素材
  15. 识别电路板上贴片电阻型号0805 0402 0603 1206封装信息
  16. FPGA学习笔面试记录(二)——FPGA基础
  17. Vue.js使用Echarts动态渲染多个图表
  18. pillow属于python标准库吗_详解Python图像处理库Pillow常用使用方法
  19. 计算机音乐童话,童话故事背景音乐
  20. hutool工具类导出excel添加水印

热门文章

  1. 【Spark大数据处理】动手写WordCount
  2. 关于js中的判断数组为空的问题
  3. note_maven的概念,作用
  4. 上项线体表位置_体表定位
  5. 软件测试常见笔试面试题(二)
  6. linux spidev 应用_嵌入式Linux设备树语法总结
  7. ckfinder java 源码,关于不再找java使用CKFinder的原因
  8. mysql root 注入_sql注入入门之mysqlroot权限下的注入利用方式
  9. mysql主从架构搭建_技术 | 手把手教你搭建MySQL主从架构
  10. python多进程并发代码_Python并发编程系列之多进程(multiprocessing)