本章中,我会分享在GMT6中,如何利用数据绘制地图和彩图。在本篇中,我不会使用数据判别(if文嵌入)和二维化(gmt surface),而是利用下载的NetCDF格式的NOAA的1/4° daily Optimum Interpolation Sea Surface Temperature (OISST)数据直接进行绘制,并制作gif格式的动态图片。 惯例,先上结果。
+ D1 |/ {+ F" U! \# j# Y. ~) W+ B+ H
简单来说,这张动态图是由不同日期的海面温度数据组合而成,并且每张图都对日期进行标注。因此,我们分别分三部分来讲解。 下载数据 单独绘制每一张图 将所有图片合并为GIF格式的动图 ! J" L3 y# j( m8 O% g6 u+ J" [
下载数据本章所使用的数据来自NOAA的OISST。它是基于卫星遥感和现场观测的数据进行合成,是常用的一种日平均海面温度数据,并且可以免费下载。 它的格式为NetCDF。 下载数据,我们既可以在网页浏览器里直接点击下载,也可以使用命令wget。比如,这条命令就可以下载2020年6月1日的海温数据。 不同日期的数据地址虽然不一样,但是有一定规律。比如,我们观察OISST的数据地址,可以发现所有数据的地址都有统一的部分,而之后则是按照年月分,并且文件名以年月日命名。具有一定规律的地址,我们就可以利用循环进行批量下载。) M! h4 R. q; u9 c) | U' B
; g- d, R% l% v9 M6 {- o具体怎么批量执行命令,我在下面绘制图片的部分中会有提及,大家可以根据之后的内容自行练习如何批量下载。 绘制图片按照惯例,先放上代码。 下面,我们开始一一解读代码(与前几篇相同的参数设定部分,我们略过不表)。 这段内容,主要是设定绘图之后的图片保存位置。利用Linux、Mac的命令,可以方便地新建文件夹(如果存在,则不新建)。 本章中的绘制区域,由range参数进行设定。在地图绘制中,取值范围为x方向0-360或者是-180~180,y方向为-90/90。这里需要注意的是,GMT要求绘图范围的起始点不能大于终点,比如我想绘制一幅东经170到西经170的图,那么就不能写成170/-170,而是应该使用0-360的表示法(170/190)。 GMT接受若干种范围的表达方式,最常用的就是当前给出的格式,即xmin/xmax/ymin/ymax。因此,这里所代表的的意义为经度范围东经100度到东经160度,纬度范围北纬10度到北纬50度。这种制定方法,底图的形状会根据投影不同而发生改变(矩形、扇形等)。 如果绘图要求地图为长方形,则还有一种常用的表达方式,即xmin/ymin/xmax/ymax,但是在-R后面添加是需要增加小写的'r'。以本章的数据为例,写作 ‘-R100/10/160/50r’ 。 size、xanot和yanot,与之前一样,分别表示图的大小,x、y方向的刻度分配。 接下来,我们先略去gmt绘图部分,单独看循环。 这里,我使用了for循环,结尾为done。date和cdate两个变量,根据循环因子ti的大小,分别通过gdate命令进行日期计算和输出为我们希望的格式。gdate(mac版的date)的教程,网上有很多,我这里只简单解释一下我所用的方式及原因。 首先,我所下载的数据从2020年6月1日开始至6月18日,且时间间隔为天。因此,我设定日期计算的基准为start=20200601。随后,根据ti循环的数字,利用gdate对其进行天数的加算,以实现从1号到18号的日期变动。 其次,我选择了两种不同的输出格式:date表现的格式为%b-%d-%Y,即 Jun-01-2020这样的形式,我用于在图中表示日期;而cdate的表现格式为%Y%m%d,即20200601的形式,用于对应文件名。 注:我使用的环境是mac,因此命令为gdate(非自带,需另行安装,参考方法:brew install coreutils)。 绘制海表面温度(SST) E5 Y0 B, d3 f
这里我们逐行解释。 ${psdir}sst_${cdate} jpeg:指定绘图的格式为jpeg,而文件名则会根据日期的不同,分别命名,如sst_20200601.jpg。 gmt makecpt -Cseis -T5/35/1 -D -I:由于我们绘制的区域为以东海为中心,主要是温带,因此我们表示海表面温度的颜色范围取了5到35,选择的基准色为反向的seis。 in:表示输入数据,文件名会根据日期进行变化。 gmt basemap :绘制底图的命令。唯一与之前不同的是,我们绘制的并不是简单的二维三维坐标,而是地理坐标,因此我们需要选择适当的地理投影。本图中,我们使用的地图投影模式是等距长方投影 (Equirectangular projection,-Jq[lon0/[lat0/]]scale 或者 -JQ[lon0/[lat0/]]width)。这里,lon0是必须的,为投影的基准经线。而lat0可加可不加。 grdimage:绘图的重要命令。其后一般跟的是输入文件。由于GMT可以直接读取netcdf格式的文件,我们可以简单地利用内置命令进行绘制。-C表示使用上面makecpt生成的颜色。 "$in?sst[0,0]": netcdf格式的文件可以通过 ‘文件名+?+变量名’来直接读取数据。OISST的数据中的sst是四维数组,其内容为: 尽管,它的第一纬和第二纬仅仅为1,但是gmt无法读取。因此我们,只需将sst的前两维指定之后(即[0,0]),GMT就可以读取了。注:gmt的第一纬从0开始。 grdcontour:绘制等值线。-C5表示等值线间隔为5,-A5f12表示每间隔5的线上标出标签(数值大小)且字号为12。 -W0.7表示线粗细为0.7p。 coast:绘制海岸线。-G表示填充,而-Gblack则是填充黑色。-D是表示海岸线精细度,-Dl表示low精细度。这通常在绘制范围广阔的地图时,(l)ow甚至(c)rude已经足够。一般需要根据绘制区域,选择使用(f)ull, (h)igh, (i)ntermediate。 text:添加文字。与之前讲解的一样。-N表示文字的坐标不受-R指定的范围限制。-F是针对文字的设定,+a0表示角度为0,+f12p,Times表示字体为Times字号12,+jLT表示锚点是左(L)上(T),-Gwhite表示文本框填充白色,-Wthinner表示文本框边框为'较细'。 colorbar:绘制色阶。-DJBC表示定位图的底部(B)中间(C),+h表示水平,-C表示使用颜色基准文件,-Bx表示设置色阶的x方向,+l"degC"表示添加文字“degC”,-Np表示色条有间隔非连续,-B5表示刻度间隔为5。 gmt end:结束绘制。 新版GMT提供了Movie选项,有一定的便利性。无奈本人还没有吃透,这里主要用GMT4和5常用的手法,即使用convert命令(非GMT的类似命令gmtconvert)。 这条命令是将之前批量绘制的图片(sst_*.jpg,星号表示不指定,即所有符合格式的图片)转换为sst.gif,即动图。其中的选项意义为: -loop:循环次数。0表示永远循环。 -delay:表示每张图出现的间隔,单位为毫秒(ms)。 -density:图像分辨率。数字越大越清晰,但是受限于原始文件。如果原始文件使用ps,eps,pdf等矢量图片,则可无限制提高。 -set dispose previous:每次显示图片前清除前一张。 这条命令主要是为了防止之前图片一直存在,导致后面文件显示的文字/图像重叠。 至此,绘制完成。 小结
2 [, a9 o! U) c) P; y w
本篇中,我们以绘制彩色图像为主题,还间接提到了一部分linux/mac命令的使用方法。希望对大家进行批量处理和动图制作有所帮助。 7 z3 I' R- h& w C J: A
|