导图社区 NCL编程学习
根据大学所学NCL语言所制作,内容较为丰富,便于查询。NCL语言与其它声明型语言不同:它基于一阶逻辑(量词、布尔逻辑、数值约束、集合运算和逻辑函数)自然地对问题建模;它在实数、整数、布尔、日期/时间、指针及集合的混合域上以混合集合规划算法对问题求解。
编辑于2021-04-23 09:57:08考研数学,根据《陈文灯考研数学复习指南》制作,高等数学部分几乎全覆盖,本人凭此斩获考研数学高分,全国大学生数学竞赛一等奖。适合考研,也适合本科学习,或者高数竞赛。此部分内容包含:10、多元函数微分学11、重积分12、曲线、曲面积分及场论初步13、函数方程与不等式证明。
考研数学,根据《陈文灯考研数学复习指南》制作,高等数学部分几乎全覆盖,本人凭此斩获考研数学高分,全国大学生数学竞赛一等奖。适合考研,也适合本科学习,或者高数竞赛。此部分内容包含:7、一元微积分的应用8、无穷级数9、矢量代数与空间解析几何。
考研数学,根据《陈文灯考研数学复习指南》制作,高等数学部分几乎全覆盖,本人凭此斩获考研数学高分,全国大学生数学竞赛一等奖。适合考研,也适合本科学习,或者高数竞赛。此部分内容包含:4、定积分与反常积分5、微分中值定理6、常微分方程。
社区模板帮助中心,点此进入>>
考研数学,根据《陈文灯考研数学复习指南》制作,高等数学部分几乎全覆盖,本人凭此斩获考研数学高分,全国大学生数学竞赛一等奖。适合考研,也适合本科学习,或者高数竞赛。此部分内容包含:10、多元函数微分学11、重积分12、曲线、曲面积分及场论初步13、函数方程与不等式证明。
考研数学,根据《陈文灯考研数学复习指南》制作,高等数学部分几乎全覆盖,本人凭此斩获考研数学高分,全国大学生数学竞赛一等奖。适合考研,也适合本科学习,或者高数竞赛。此部分内容包含:7、一元微积分的应用8、无穷级数9、矢量代数与空间解析几何。
考研数学,根据《陈文灯考研数学复习指南》制作,高等数学部分几乎全覆盖,本人凭此斩获考研数学高分,全国大学生数学竞赛一等奖。适合考研,也适合本科学习,或者高数竞赛。此部分内容包含:4、定积分与反常积分5、微分中值定理6、常微分方程。
NCL
路径
Ubuntu
cd /mnt/d/...
以电脑本地D盘为例
CYGwin
cd /cygdrive/d/...
以电脑本地D盘为例
./filename
当前路径
/pass/filename
绝对路径
filename
相对路径
交互
system
执行 shell 命令
procedure system (command [1] : string)
such as:system (“/bin/rm –f “ + file_name)
systemfunc
执行 shell 命令并返回输出
function systemfunc (command [1] : string)
return_val [1] : string
返回包含执行 shell 命令的输出的单独标注的字符串数组
此函数将字符串命令传递给 shell 环境以执行。命令完成后,shell 命令的输出将作为字符串返回到 NCL,并将控件返回到 NCL
example
TimeDate = systemfunc("date")
myFiles = systemfunc("ls *.nc")
diri = "/ptmp/user/data/AnnualData/"
fils = systemfunc("ls " + diri + "annual*")
fils = systemfunc ("csh -c 'cd " + diri + " ; ls annual*'")
cmd = "find /home/user/main/a* -type f -print"
fili = systemfunc(cmd)
Date = systemfunc(“date ‘+%a %m%d%y %H%M’ ”) ; 单引号
fils = systemfunc (“cd /some/directory ; ls foo*nc”) ; 分号
语法
位置:官网-NCL Home > Documentation > Language
符号
;
单行注释
多行注释
/;
代码
;/
@
创建/引用属性
!
创建/引用命名维度
&
创建/引用坐标变量
{...}
用于坐标带下标
(/.../)
创建数组,只包含值,不包含属性、命名维度等
:
用于数组索引
|
用于命名维度分隔符
\
续行号(行尾)
->
用于输入输出支持的数据格式
[...]
类型列表下标变量
::
用于调用外部代码分隔符
$...$
通过内置函数addfile输入输出变量时封装字符串
x = fin->$variable(n)$
运算符
代数
+
加法/字符串连接
"alpha"+"_"+(5.3+7) ,即“alpha_12.3”
-
减法
*
乘法
/
除法
^
乘方
%
模(整数运算)(取余数)
#
矩阵乘法
>和<
大于/小于
逻辑
.lt.
小于
.gt.
大于
.ne.
不等于
.and.
与
.xor.
异或
一真一假返回真
.le.
小于等于
.ge.
大于等于
.eq.
等于
.or.
或
.not.
非
赋值
初次赋值
=
重新赋值
:=
在维度、尺寸、类型等不一致时必须重新赋值
先delete( ),再用“=”赋值
流程
顺序结构
begin
语句体
end
选择结构
if(标量逻辑表达式) then
语句体
elseif(标量逻辑表达式)/else
6.6.2之后才有elseif语句
语句
end if
如果用else if(中间有空格),后面需要加then,且整个选择结构有几个“if”(包括else if),便要在结尾用几个end if
if (scalar_logical_expression) then
statement list
else if (scalar_logical_expression) then
statement list
else if (scalar_logical_expression) then
statement list
else
statement list
end if
end if
end if
循环结构
当型循环
do while(标量逻辑表达式)
循环体
end do
计次循环
do n=start,end(,step)
循环体
end do
循环控制
break退出循环
continue跳过本次循环
Function codes
上标
superscripts:x~S~2~N~ + y~S~2~N~
superscripts:x² + y²
下标
superscripts:CH~B~4~N~ + N~B~2~N~O
superscripts:CH4 + N2O(应为下标,无法键入)
特殊符号
Happy ~F35~r~F~ Valentine's Day
——Happy ❤ Valentine's Day
else:http://www.ncl.ucar.edu/Applications/fcodes.shtml
数组
命名:字母开头,允许数字及下划线,大小写敏感
类型
有符号数
double、int64——64;float、integer、long——32;short——16
科学计数法
float
e/E
double
d/D
无符号数
uint64——64;ulong、unit——32;ushort——16;byte——8
非数值型
string、character、graphic、file、logical、list、char
创建
(/.../)
数字
直接放入数字即可
可用科学计数法
数组类型取范围最广的那个
小数
默认浮点型float
若需要double型
内部数据采用double的科学计数法
数组乘以“1d0”,转换为双精度型
字符
每一个数组元素需要加英文双引号""
逻辑
logical
True
False
类似数字,不需要加英文双引号""
多维
嵌套使用,由多个一维数组组成
(/(/.../),(/.../),(/.../)/)
函数
new(数组大小/形状,数据类型,[缺失值])
数据类型是否加英文双引号""均可
一维
直接给出维度大小
多维
需要以数组形式给出
ispan(start,end,step)
整数,步长不可省略
fspan(start,end,npts)
可为浮点数,第三个参数表示所有点个数
删除
delete(变量名)
删除单个变量
delete([/.../])
一次性删除多个变量
编程语言区别
NCL/C/C++
0开始 ; 左(最慢) – 右(最快)
FORTRAN/MATLAB/R
1开始 ; 左(最快) – 右(最慢)
IDL
0开始 ; 左(最快) – 右(最慢)
属性attribute
@
定义属性
@_FillValue
填充值,多见于缺测或无效数据
ismissing( )判断是否为缺失值
@long_name
名称,多用于指明物理量
@units
单位,NCL在计算或绘图时可能会根据单位进行相应处理,经度degrees_east,纬度degrees_north,高度km或气压坐标hPa,时间hours since 1990-1-1
@add_offset
偏移量
@scale_factor
缩放倍率
实际值=存储值*@scale_factor+@add_offset
维度dimension
!
添加维度信息:数组名!0、1、2="lon、lat、lev"
&
添加维度坐标:数组名&lon、lat、lev=某一维单调数组
注意
添加维度信息、维度坐标,建议在数组赋值之后进行
索引
序号
[起始索引(0)]:[结束索引(N-1)][:可选步长(1)]
:
全部
::step
每间隔step步长取一个
::-1
逆序
单个数值
这一维度只取一个数据,相当于缩小维度
维度
类似序号,有实际物理意义,但需要加{}
变形
维度顺序
借助命名维度,符号|
T2=T(Lat|:,{Lon|70:140},{Lev|200:10},Time|0:5)
缩减维度
array(k,...)自动省略单一维度,其它维度按顺序保留
array(k:k,...)强制保留单一维度
显示结果
按需求输出详细信息,包括数据
print ( "T: min="+min(T)+" max="+max(T) )
嵌入格式化输出
sprintf
print ( "min(T) = "+ sprintf("%5.2f ", min(T)) )
控制小数位数及整体长度
sprinti
fnam = "h" + sprinti ("%0.5i", n) + ".nc"
用0填充左边,控制整数长度
printVarSummary
输出摘要,不输出数据
printMinMax(data,opt)
opt=True (or 1)
换行打印最大最小值
opt=False(or 0)
打印之前不会换行
write_matrix(x[*][*], fmt, opt)
可写入文件,也可直接输出
write_matrix (T, “5f7.2”, False)
写入文件
opt = True
opt@fout = “foo.ascii”
write_matrix (T, “5f7.2”, opt)
会在文件部分详细说明
列表
创建
f = addfiles(…)
x = [/…/]
a = NewList(…)
索引
同数组序号索引
s = q[2:8:2]->X
注意区别
u = f->U(:, 3:9:2, :, 10:20)
列表内数据类型可以不单一
函数
维度操作
dim_*_n
v5.1.1以上有
n表示对第几维进行操作,注意:从0开始
dim_*
仅对最右边维度的行列操作
若所需进行操作的维度不在最右边,需要进行维度调整后再使用
维度平均
dim_avg_n (data,dims[*])
data:数组
dims[*]:求哪一维度或哪些维度的平均,维度从0开始
dim_avg_n(data,(/1,2/))
dim_avg_n(data,0)
month_to_annual(x,opt)
年度平均、总和
opt = 1
温度、风速等求年平均
opt = 0
降水等求年总和
month_to_season
季度平均
sst_season3 = month_to_seasonN(s,(/"MAM","JJA","SON"/))
左边增加一维
数组维数
dimsizes(x)
多维数组,则返回值为1D 整型数组
创建数组
new(数组大小/形状,数据类型,[缺失值])
数据类型是否加英文双引号""均可
一维
直接给出维度大小
多维
需要以数组形式给出
ispan(start,end,step)
整数,步长不可省略
fspan(start,end,npts)
可为浮点数,第三个参数表示所有点个数
判断缺失
ismissing
xmsg = ismissing(x)
数组x挨个判断是否为缺失值,返回一个逻辑数组
通常与以下函数联用
if (all( ismissing(x) )) then … [else …] end if
nFill = num( ismissing(x) )
nVal = num( .not. ismissing(x) )
if (any( ismissing(xOrig) )) then
暂且不用
mask
[ocean=0, land=1, sea_ice=2]
ts = mask(ts,oro,1)
oro维度不能超过ts,尺寸与ts右侧对应维度相同
where
where(conditional_expression,true_value(s),false_value(s))
根据条件判断,真的地方赋第二个值,假的地方赋第三个值
x = where (T.ge.0 .and. ismissing(Z) , a+25 , 1.8*b)
扩展数组
conform( x, r, ndim )
扩展数组(r) 使其与(x) 数组维数一样(dims)
x表示模板数组,r为需要扩展的数组
ndim:标量或数组用以表明x的哪一维或哪些维和r的维数一致
示例
x(ntim,klev,nlat,mlon), w(nlat)
wx = conform (x, w, 2)
q = x*wx
conform_dims( dims, r, ndim )
类似conform,用以指定维度大小的情况下
示例
wx = conform_dims ( (/ntim,klev,nlat,mlon/) , w, 2)
wx = conform_dims ( dimsizes(x), w, 2)
返回索引
ind(larray[*]:logical)
仅仅对一维数组有效
但数组内部元素满足条件,返回其索引值
注意:应当检查返回的indices是否缺省
即数组所有元素均不满足条件的情况
示例
ii = ind (a.gt.500 )
if (any(ismissing(ii))) then …. end if
处理多维数组,需要先进性转换
ndtooned
onedtond
x = onedtond(x1D, dimsizes(x))
dimsizes
ind_resolve(indices[*],dsizes[*])
将索引列表放入一维数组(从多维数组转换),返回在多维数组中表示的索引列表
indices:索引列表到一维数组中,从多维数组转换为一维数组
sizes:多维数组的尺寸列表
get1Dindex(data[*], ymSelect[*])
返回指定值索引值或数组
日期转换
cd_calendar(time,option)
Available in version 6.0.0 and later.
转换为UTC时间
option
integer型参数
option = 0
type float and dimensioned dimsizes(time) x 6
utc_date(:,0) --> years
utc_date(:,1) --> months
utc_date(:,2) --> days
utc_date(:,3) --> hours
utc_date(:,4) --> minutes
utc_date(:,5) --> seconds
option = -1 or 1
format YYYYMM
type double for option = 1
type integer for option = -1
option = -2 or 2
ormat YYYYMMDD
type double for option = 2
type integer for option = -2
option = -3 or 3
format YYYYMMDDHH
type double for option = 3
type integer for option = -3
option = 4
format YYYY.fraction_of_year
ype double
fraction_of_year is the total number of seconds in the current day of the year, divided by the total number of seconds in that year.
option = -5
The same as option=0, except the values returned will be integers.
示例
time = (/17522904, 17522928, 17522952, 17522976, 17523000/)
time@units = "hours since 1-1-1 00:00:0.0"
utc_date = cd_calendar(time, 0)
具体读取
year = tointeger(utc_date(:,0)) ; Convert to integer for
month = tointeger(utc_date(:,1)) ; use sprinti
day = tointeger(utc_date(:,2))
hour = tointeger(utc_date(:,3))
minute = tointeger(utc_date(:,4))
second = utc_date(:,5)
输出
date_str = sprinti("%0.2iZ ", hour) + sprinti("%0.2i ", day) + \
month_abbr(month) + " " + sprinti("%0.4i", year)
结果
(0) 00Z 01 Jan 2000
(1) 00Z 02 Jan 2000
(2) 00Z 03 Jan 2000
(3) 00Z 04 Jan 2000
(4) 00Z 05 Jan 2000
cd_inv_calendar
反向转换,UTV时间转换为自"hours since 1-1-1 00:00:0.0"
TIME = cd_inv_calendar (iyr, imo, iday, ihr, imin, sec,“hours since 1-1-1 00:00:0.0” ,0)
字符截取
str_*
str_get_field(string_val,field_number[1],delimiter[1])
string_val : string
field_number [1] : integer
An integer indicating which field to return; starts from 1.
delimiter [1] : string
分隔符,如空格、下划线、某一字母等等
对第一个数组内的字符串进行处理,确定分隔符号,选取所需小段
str_get_cols(string_val,start_col,end_col)
string_val : string
start_col [1] : integer
起始列
end_col [1] : integer
结束列
从字符串抓取的起始列和结束列,从0开始
加载脚本
load "/path/my_script.ncl"
用环境变量: NCL_DEF_SCRIPTS_DIR
必须在使用前加载
自定义函数
有返回值
undef (“function_name”) ; 可选
function function_name (declaration_list)
多个参数之间用逗号隔开即可
local local_identifier_list ; 可选
列出本函数所用到参数,都好分隔即可,可不写全或不写
begin ; 必选
statements
return (return_value) ;必选
end ;必选
无返回值
undef ("procedure_name") ;可选
procedure procedure_name (declaration_list)
local local_identifier_list ;可选
begin ;必选
statements
end ;必选
以上不在主程序内,写完自定义函数后,仍需要再写主程序
begin
statements
主程序语句
end
参数传递
受限的参数指定
需要指定数据类型, 维数和大小
procedure ex(data[*][*]:float,res:logical,text:string)
一般的指定
仅数据类型
function xy_interp(x1:numeric, x2:numeric)
不指定数据类型和维数
procedure whatever (a, b, c)
复合型
function ex (d[*]:float, x:numeric, wks:graphic, y[2], a)
元数据保留
计算过程中可造成元数据的丢失
内置函数可造成元数据的丢失
copy
copy_VarMeta(var_from,var_to)
将var_from的所有属性、命名维度和坐标变量复制到var_to
copy_VarCoords(var_from,var_to)
将所有命名维度和坐标变量从一个变量复制到另一个变量
copy_VarAtts(var_from,var_to)
将变量的所有属性从var_from复制到var_to
如果var_to已包含与var_from属性之一同名的属性,则删除该属性并复制新属性
use wrapper functions
后缀带_Wrap的函数
在计算前,通过 变量间传输+ 降维 来定义数组
f = addfile("dummy.nc", "r")
x = f->X ; x(time,lev,lat,lon)
xZon = x(:,:,:,0) ; xZon(time,lev,lat)
xZon = dim_avg_n (x, 0)
仅读取数据和_FillValue属性
a = (/b/)
格点函数
双线性插值
linint2
面积守恒内插
area_conserve_remap
area_conserve_remap_Wrap
area_hi2lores
area_hi2lores_Wrap
三种内插方法
Bilinear
Conservative
Patch
全局变量
Global Variables
可以被任意函数或程序访问
与局域变量不同
NCL并不含有“global variables”
内置函数
具体参考官网,掌握常用即可
month_to_annual
年(可求平均、总和)
month_to_season
季节(可求平均、总和)
stdatmus_z2tdp
标准大气温度廓线、气压廓线、密度廓线
regline
一元回归分析,返回线性拟合系数及相关属性值
student_t(t,df)
显著性检验,搭配拟合函数使用
t是有拟合类函数比如regline返回的@tval属性(t统计),具体属性名参考拟合函数返回信息
df是自由度,一般为n-2,n表示拟合数据的尺寸(x或y的个数)
p = student_t(t,df),p > 0.05,按α=0.05水准,不拒绝H0(原假设),两者的差别无统计学意义——即不显著(p是无效假设成立的几率,p>α,则无效假设成立,不显著)(无效假设:假设两组结果间差异不显著,即实验处理对结果没有影响或无效)
escorc
计算多点之间相关系数
rtest
多点之间相关系数显著性检验,可搭配escorc使用
regCoef
计算线性趋势,可结合student_t进行显著性检验
lspoly
一元多次曲线拟合,可拟合二次、三次、甚至更高次曲线
linint2
插值函数,进行格点插值
文件
判断文件是否存在
fileexists
if (fileexists(filename)) then ...
文件存在返回真,不需要是addfile支持的文件
isfilepresent
if (isfilepresent(filename)) then ...
文件存在返回真,必须是addfile支持的文件
isfile
if (isfile(arg)) then ...
是一个文件,则返回真
arg:A variable of any type or dimensionality.
example
fi = addfile("testfile.nc","c")
print(isfile(fi))
格式
支持格式
netCDF-3/4 [network Common Data Form]
HDF4/H5 [Hierarchical Data Format (Scientific Data Set only) ]
HDF-EOS [Earth Observing System; HDF4 and HDF5]
GRIB-1/2 [Grid in Binary; WMO standard; NCEP, ECMWF]
CCMHT [CCM History Tape; COS blocked only; ccm2nc]
Shapefile [ESRI: geospatial vector data format GIS]
6.1.0 -> near complete netCDF4, HDF5
Binary
sequential [F: open(_,form="unformatted", access="sequential")]
flat/direct [F: open(_,form="unformatted",access=direct",recl=_)] [C: write]
暂不需要掌握
ASCII
行列形式排列的数据
路径
./filename
当前路径
/pass/filename
绝对路径
filename
相对路径
查询
ncl_filedump [-c] [-v var1[,…]] [–h] file_name
若不能使用,采用ncdump也可
ncl_filedump foo.grb > foo.txt [传至文档]
ncl_filedump foo.hdf | less [传至屏幕]
ncl_filedump -v lat file_name
查看lat变量的相关信息
ncdump -h file_name
file_name 在命令行中必须有一个后缀
.nc .grb .hdf .hdfeos .he5 .h5 .ccm .shp
转换
ncl_convert2nc File(s) OPTIONS
将GRIB/HDF/SHAPE 文档转换至netCDF
输出的文档名和输入一致,当以.nc为后缀名
ncl_convert2nc –h
提供使用的选项信息
ncl_convert2nc foo.grb
生成 foo.nc
ncl_convert2nc foo.hdf –L –nc4c –cl 1
-L (文件> 2GB); -nc4c (netCDF4); -cl 1 (compression lvl 1)
读写
f = addfile (file_name.ext, status )
file_name => 任何符合规则的文件名; 字符
ext => 识别文件类型; 字符
netCDF: “nc” or “cdf” [读/写]
HDF: "hdf" , "hdfeos", "h5", "he5" [读/写]
GRIB: “grb” , “grib” [仅读; GRIB1 或 GRIB2]
CCMHT: "ccm" [仅读]
SHAPE (GIS): "shp" [仅读]
status [状态]
"r"
读
"w"
写
"c"
创建
在生成文档前,用system移除相应文档(以防出错)
fname = “out.nc”
应该先判断文件是否存在,否则也会报错
system("/bin/rm –f ”+fname)
fout = addfile(fname, "c")
f
指向一个单独的文件
也许有属性 (文件属性或者全域属性)
u = f->U
读取variable以及all meta data至内存中
在 -> 符号的左和右边不允许有空格 [ 否则有fatal error]
用“$”表示变量名(必须是string型)
vNam = (/ "U","T" /) ; 手动指定
do n=0,dimsizes(vNam)-1
x = f->$vNam(n)$ ; $..$ 替代字符
end do
u = (/ f->U /)
仅读取数据和_FillValue属性
fout->U2 = u
输出变量 u 至 nc 文档
fout = addfile("out.nc","c") ; create 文件用以输出
提取 byte/short 变量
us = f->U
读取变量和meta data
(通常而言) 用户要将其转换至 float型
COARDS 规则: 乘上scale value 再加上offset
uf = us*us@scale_factor + us@add_offset
最好加载contributed.ncl [short2flt, byte2flt]
u = short2flt(f->u)
u = byte2flt(f->u)
q = addfiles (fNames, "r")
批量读入
fNames 是一个文件名的1D 数组 (字符)
可用于any supported format
从技术层面看, “q” 是一个list类型变量
数据提取
T = q[:]->T ; [:] 读所有文件
从list ‘q’中的所有文件中读取T [with meta data]
T 必须存在于每一个文件中并且一样大小[秩]
a list 用来对addfiles的结果进行排序
lat = q[0]->lat ; [0] 从第一个文件中读取
Z = q[2:6:2]->Z ; 仅从2,4,6文件中提取Z
通常文件变量选取用 "[…]"
变量合并
ListSetType (a, “cat”) [默认; "cat" => concatenation]
continuous record
f = addfiles (fils, "r")
ListSetType(f, “cat”) ; 不必须[因为是默认值]
T = f[:]->T
维度不变,T变量维度的尺寸增加
ListSetType (a, "join")
creating ensembles
数组维数将被增加
f = addfiles (fils, "r")
ListSetType (f, "join")
T = f[:]->T
T增加一维,尺度为文件数
产生
netCDF/HDF
支持类型
简单(也许不高效,但常用)
fout = addfile ("foo.nc", "c")
fout@title = "Simple Example”
fout@creation_date = systemfunc(“date”)
; if ‘time’
filedimdef (fout, "time", -1, True) ; create ud
fout->U = u
fout->T = Temp
高效
事先定义netCDF/HDF的NCL 函数
setfileoption: 指定定义模式
filevardef: 定义一个或多个变量名
filevarattdef: 从一个或多个变量中复制属性
filedimdef: 定义维数(包括无限制的维数)
fileattdef: 复制属性作为全域属性
具体暂不需掌握
ASCII
读取
简单读取
asciiread (filepath,dimensions [*],datatype)
filepath [1] : string
查找 ASCII 文件所需的完整或相对路径
dimensions [*] : integer or long
标量或一维数组,指定要读取的数据的尺寸大小
若为-1,则表示全部数据读取为一维数组
datatype [1] : string
表示要读取的数据类型的字符串
需要加英文双引号""
只会读取文件中的数据,其他非数据类型不会读入(尺度可以选择-1)
返回一个一维数组,@_FillValue需要手动赋值
若需要,可以利用onedtond把数据转化为二维数组
控制格式
readAsciiTable (filename,ncol,data_type,opt)
filename : string
要读取的文件名
ncol : integer or long
表示文件中列数的标量
data_type : string
表示表中数据类型(即"浮动")的字符串
需要加英文双引号""
opt
integer or long
1个
表示文件开头要忽略的行数
2个
写成一个一维数组,包含两个元素
第1个元素表示文件开头要忽略的行数
第2个元素表示文件末尾要忽略的行数
string
终止可变页眉行数的字符序列
即从第一列开始寻找,找到该字符串后,从其下一行开始读取数据
返回一个数组,@_FillValue需要手动赋值
读入多个文件
systemfunc: 从unix/linux中返回信息
fnames = systemfunc ("ls reAnal*")
fpath = systemfunc("ls /mydata/reAnal*") ; full path
fils = systemfunc("cd "+path+ " ; ls reAnal*")
其中: path = "/my/data/"
fnames = (/ "file1" , "file2", ... /)
example
pathi = “/data0/shea/"
fnames = (/ "reAnal1", "reAnal2", "reAnal3", "reAnal4"/)
nfiles = dimsizes(fnames) ; nfiles = 4
do nf =0,nfiles-1
f = addfile (pathi+fnames(nf)+".grb", "r")
……
end do
写入
asciiwrite(filepath,var)
生成一个含ASCII字符的文档
每行一个值
不控制其格式
example
s = (/"apple", "orange", "I like fruit!"/)
asciiwrite ("fooString" , s)
write_matrix(x[*][*],fmtf,option)
若x不是2D,用T=onedtond( ndtooned(TT) , (/N,M/))
原则上生成一个二维数组文件
可以调整其格式,整齐美观
可加属性
fout
title
tspace
row
data [*][*] : numeric, ; integer, float, or double
fmtf : string
要使用的格式,通过 Fortran 样式指定
https://wenku.baidu.com/view/7e586b8f6529647d2728525d.html
fmtf = M + "f" + fWidth + "." + fDec; same as "7f7.2"
option : logical
True
此变量可能具有以下一个或多个属性的关联
可文件输出
@fout属性
指定文件名(可包含绝对路径)
示例(创建ascii文件)
opt = True
opt@fout = “foo.ascii” ; 文件名
write_matrix (T, "5f7.2", opt)
False
数据将根据用户指定的格式写入标准
即屏幕输出
write_table(filename,option,alist,format)
filename [1] : string
option [1] : string
"w" to overwrite, "a" to append.
alist [1] : list
strings = (/"string11","string12","string13"/)
numbers = (/1,2,3/)
alist = [/strings + numbers/]
; Use '+' to concatenate numbers to end of strings
format [1] : string
write_table(fname, "w", hlist, "%s")
write_table(fname, "a", alist, "%d%16.2f%s%d%ld")
每种格式之间可以添加空格,逗号等等,会作为分隔符出现
绘图
五步绘制NCL图形
加载 “gsn” 脚本
非重点
注:现在已经不需要加载脚本,故此部分不重要
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
“gsn”意为“Getting Started using NCL”
“csm”意为“Climate System Model”
“gsn_csm.ncl”中的函数更加“metadata aware”
gsn_csm.ncl 含有 会寻找“CESM”规则的接口、
gsn_csm.ncl 会用到gsn_code.ncl里的函数; 加载的顺序十分重要
gsn_code.ncl 有“generic” 接口和辅助性的代码
需注意
_FillValue 属性 被识别为缺省值 (“missing_value” 不会!)
数据的属性,比如 可能被用来绘制图题的“long_name”和“units”
如果数据有1D的坐标数组,且在地图上进行绘图,那么必须存在“degrees_east” or “degrees_north” 的“units” 属性
打开一个 workstation
“Workstation” 指绘图的地方
PostScript (“ps”) (“eps” – 仅一页图)
PDF (“pdf”)
X11 window (“x11” – 有助于debugging)
PNG (“png”)
NCGM (“ncgm”) – 很少用
有一个默认的color map (V6.1.0 中有改变!)
一个 “frame” 指 一个 “page”
such as
wks = gsn_open_wks(“x11”, “test”) ; X11 window
wks = gsn_open_wks(“ps”, “test”) ; “test.ps”
wks = gsn_open_wks(“png”, “wrf”) ; “wrf.png”
wks = gsn_open_wks(“pdf”, “slp”) ; “slp.pdf”
wks = gsn_open_wks(“eps”, “cn”) ; “cn.eps”
定义一个 color map (可选)
提供的默认color map (256色)
若想换,需在绘制任何图形之前调用:gsn_define_colormap(wks, “rainbow”)
rainbow是一个color map,其余可去官网查询名称,或自己定义
自定义color map
生成红绿蓝 (RGB) 三个颜色的数值,范围均是0~255. 数值越大,颜色越深。若三个数值一样,则是灰色(不同色阶)。前景和后景色不必手动设置(默认)。
将数值存入xxxx.rgb,“xxxx”即为该color table的名字
文件开头两行写入
ncolors=n
# r g b
随后,每行按三个数一组写入,如:
160 32 240
0 0 180
将xxxx.rgb 放入 $NCARG_ROOT/lib/ncarg/colormaps/路径下。否则需设定环境变量NCARG_COLORMAPS或每次运行时写上绝对路径
测试
begin
wks = gsn_open_wks("x11","test")
gsn_define_colormap(wks,"xxxx")
gsn_draw_colormap(wks)
end
此外,也可利用HSV (Hue, Saturation, Value)进行颜色挑选
设定绘图选项(resources)
Resources NCL 绘图中的核心部分. 有超过1,400 resources!
利用resources 修改图型
它们按object类型归类.
有11个 “graphical” objects: contours, labelbars, legends, maps, primitives, streamlines, text strings, tickmarks, titles, vectors, XY plots
构成
以2至3个小写字母开头,以对应其object类型
“xy” - XY Plot
“vc” - Vector plot
“tm” - Tickmark
“cn” - Contour plot
“ti” - Title
“lb” - Labelbar
“mp” - map
“lg” - legend
“gs” - gsn
“tr” - transformation
etc.
单词; 首字母大写
xyLineColor
cnFillOn
tiMainString
vcRefMagnitudeF
gsnMaximize
有些以“F”结尾,用以表明浮点型resource : “xyLineThicknessF”
“gsn”:可被“gsn”脚本识别的特殊resources
不同 objects下resources可能有类似的形式,这是为了便于理解和调用
xyLineColor, cnLineColor, gsLineColor, mpGridLineColor, tmBorderLineColor
tiMainFontHeightF, tmXBLabelFontHeightF, lbLabelFontHeightF, cnLineLabelFontHeightF
xyDashPattern, mpPerimLineDashPattern, lbBoxLineDashPattern, cnLineDashPattern
etc.
用法
Resources 以属性(attributes)的形式赋值给NCL的 logical 变量
res = True ; 可以任意命名“res”
res@mpMinLatF = 30 ; 小数点不是必须
res@tiMainString = “This is a title”
res@tmXBLabelFontHeightF = 0.01
res@cnLineLabelsOn = True
res@xyLineColors = (/5,7,11/)
res@xyLineColors = (/“red”, “green”, “blue”/)
res@xyLineThicknesses = (/ 1.0, 2.0, 3/)
调用相应的绘图函数
gsn_csm_xxxxx
xy = gsn_csm_xy(wks,x,y,res)
plot = gsn_csm_contour(wks,data,res)
plot = gsn_csm_vector(wks,u,v,res)
map = gsn_csm_vector_map(wks,u,v,res)
phgt = gsn_csm_pres_hgt(wks,data,res)
plot = gsn_csm_contour_map(wks,data,res)
etc.(都是函数,等式左端的变量名可任意取)
simple example
begin
y = sin(0.0628*ispan(0,100,1)) ; 101 points
wks = gsn_open_wks("png","test") ; ‘test.png’
gsn_define_colormap(wks,"rainbow")
res = True ; plot options
res@xyLineColor = "Blue" ; line color
res@tiMainString = "This is a title"
res@gsnMaximize = True
plot = gsn_csm_y(wks,y,res) ; no X values
end
XY
基本命令
gsn_csm_y
begin
y = sin(0.0628*ispan(0,100,1)) ; 101 points
wks = gsn_open_wks("ps","xy1a") ; “xy1a.ps”
res = True ; 暂不需要修改图形
plot = gsn_csm_y(wks,y,res) ; no X values
end
没有x变量,y的索引充当
gsn_csm_xy
begin
x = ispan(0,100,1)
y = sin(x)
wks = gsn_open_wks("ps","xy1a") ; “xy1a.ps”
res = True ; 暂不需要修改图形
plot = gsn_csm_xy(wks,x,y,res)
end
x与y的尺寸严格对应,具有函数关系
y(a:b) = y@_FillValue
设置缺失值部分不会绘制出图形
参数设置
xyLineColor
设置线条颜色,有默认值
res@xyLineColor = number or named color
默认色表从0-255,number对应数字即可
res@xyLineColor = 2
可用相应颜色名称,需要加英文双引号""
res@xyLineColor = "brown"
xyLineThicknessF
修改线条的粗细,默认1
res@xyLineThicknessF = 3 ; 3x as thick
xyDashPattern
曲线的虚线类型
默认0,共17种,0-16
tiMainString
主要图题(Title型属性)
同样适用于contour, vector等
可以颠倒y轴刻度
可在曲线上添加标签
xyMarker
17种,0-16,其余配置参照官网
坐标轴
范围
X
trXMinF
最小值
trXMaxF
最大值
Y
trYMinF
最小值
trYMaxF
最大值
同样可应用于contour, vector和streamline plots
可借用min、max函数
刻度
x轴底部
tmXBMode, tmXBValues
标签
X轴底部
tmXBMode
res@tmXBMode = "Explicit"; 指定坐标轴标签
tmXBValues
res@tmXBValues = (/-50,-25, 0, 25, 50/)
指定相应刻度,即主刻度
tmXBLabels
res@tmXBLabels = (/"A","B","C","D","E"/)
在相应刻度显示标签
其余刻度或次刻度不会再显示
X轴顶部
tmXTMode
Y轴左侧
tmYLMode
Y轴右侧
tmYRMode
字符
tiXAxisString
会覆盖“long_name”attributes
同样适用于contour, vector等
res@tiXAxisString = "Liu Kun"
res@tiXAxisSide = "Top"
res@tiXAxisPosition = "Left"
res@tiXAxisJust = "CenterLeft"
图题设置在参数部分
res@gsnLeftString = "Asia"
在左边添加字符串
适用于范围广!
绘制多条
数据来源可以是ASCII
Y 需要调整行列为 (# curves) x (# points)
X 可以和Y维同维数,也可以仅是一维的数组,其大小需和Y的最右边维的大小一致 (# points)
example
begin
; Data on file is dimensioned # points (500)
; by # curves (4), so we need to reorder it.
y = asciiread("xy2.txt",(/500,4/),"float")
y!0 = "npts"
y!1 = "ncurves"
y2 = y(ncurves|:,npts|:) ; 把y转变成 4 x 500.
wks = gsn_open_wks ("ps","xy2a") ; "xy2a.ps"
res = True ; 暂不修改图形.
plot = gsn_csm_y (wks,y2,res)
end
线条默用不同类型的虚线,要想全部实线,需设置
res@xyMonoDashPattern = True
参数各异
res@xyLineColors = (/ "red", "brown", "green", "blue"/)
res@xyMarkLineModes = (/"lines","MarkLines", "lines","markers"/)
控制线或点
res@xyMarkers = (/ 0,16,0,15 /)
标记选择
res@xyMarkerColors = (/ 0,16,0,23 /)
标记颜色
res@xyLineThicknesses = (/ 2, 3, 4, 5/)
线粗
也可以统一设置,如
res@xyLineColor = "Purple"
图例设置
res@pmLegendDisplayMode = "Always"
res@xyExplicitLegendLabels = "line = "+ ispan(1,4,1)
图例标签
res@pmLegendOrthogonalPosF = -0.30 ; 垂直(负值向上,从底边往上0.30)
res@pmLegendParallelPosF = 0.85 ; 水平(从左边往右0.85)
res@pmLegendWidthF = 0.15
res@pmLegendHeightF = 0.06
Advanced topics
两种方法在XY图中增加数据 http://www.ncl.ucar.edu/Applications/xy.shtml#ex25 http://www.ncl.ucar.edu/Applications/xy.shtml#ex26
两曲线之间填色 http://www.ncl.ucar.edu/Applications/xy.shtml#ex24
将XY 曲线转变为柱状图 http://www.ncl.ucar.edu/Applications/bar.shtml
改变坐标轴(log, irregular, linear) http://www.ncl.ucar.edu/Applications/axes.shtml#ex3
Contour
gsn_csm_contour(wks,T,res)
数据若有_FillValue 属性, 它会自动被 by gsn_csm script识别
“units” 属性存在于lat和lon 坐标数据中
T&lon@units = “degrees_east” ; 加上单位
T&lat@units = “degrees_north”
填色等值线需要的resources
cnFillOn
打开填色设置,常搭配color map
res@cnFillOn = True ; 填色
不用color map的方法
res@cnFillPalette = "BlueYellowRed"
V6.1.0中的新方法
lbOrientation
改变labelbar方向
res@lbOrientation = “Vertical”; (垂直放置)移动labelbar
默认在底部横放,移动后在右侧竖放
color map
gsn_define_colormap
填图颜色,有默认,可不设置,详情参考绘图步骤第三步
在地图上绘制等值线
gsn_csm_contour_map(wks,T,res)
等值线叠加在圆柱等距离的地图上
数据必须有lat/lon 坐标数组,"units"必须是"degrees_east","degrees_north"
注意longitude data具有循环性. gsn_csm_xxxx 脚本默认会添加循环点
lon: [-180..180]
res@gsnAddCyclic = False
若未循环,设置未True
Contour levels
设置等值线模式:cnLevelSelectionMode
res@gsnAddCyclic = False
若要设置等值线模式前需要先进行此操作
若res@cnLevelSelectionMode = "ManualLevels"
res@cnMinLevelValF = 195 ; 最小值
res@cnMaxLevelValF = 328 ; 最大值
res@cnLevelSpacingF = 2.25 ; 间距
也可不设定 “cnLevelSpacingF”, 让其自动设置
指定等值线数值
hres@cnLevelSelectionMode = "ExplicitLevels"
hres@cnLevels = fspan(-1,1,11)
hres@cnLineThicknessF = 1.5
hres@cnLineLabelFontHeightF = 0.015
hres@cnExplicitLabelBarLabelsOn = True
hres@cnLineLabelStrings = sprintf("%.1f",hres@cnLevels)
hres@mpCenterLonF = 180
hres@gsnContourNegLineDashPattern = 1 ;负值等值线线形
hres@gsnContourPosLineDashPattern = 0 ;正值等值线线形
hres@gsnContourZeroLineThicknessF = 2.0;零值等值线粗细
关闭线条
关闭等值线
cnLinesOn
打开或关闭 contour lines
cnLinesOn = False
关闭色棒线
lbBoxLinesOn
打开或关闭 labelbar box lines
lbBoxLinesOn = False
指定 color map中的颜色段
“老”方法
gsnSpreadColorStart
默认2,除开背景色和前景色
gsnSpreadColorEnd
默认-1,即最后一色
取值范围由所选color map决定
rainbow为0-189
Advanced topics
改变labelbars标签的显示风格: http://www.ncl.ucar.edu/Applications/labelbar.shtml#ex14
设定“中间值为白色”: http://www.ncl.ucar.edu/Applications/color.shtml#ex15
控制每一条等值线的shading (patterns): http://www.ncl.ucar.edu/Applications/overlay.shtml#ex5
控制每一条等值线的color and/or thickness: http://www.ncl.ucar.edu/Applications/conOncon.shtml#ex7
关闭信息标签(好像只在绘制panel类型时需要使用)
res@cnInfoLabelOn = False ; 不绘制等值线的信息标签(信息标签好像只在panel中才会显示,单独画一张contour不会出现信息标签)
res@lbLabelStrings = labels ;指定色棒标签
res@cnExplicitLabelbarLabelson = True ;可操作色棒
strlab = new(15,"string")
strlab(0::2) = ispan(-2,33,5)
strlab(1::2) = ""
res@lbLabelStrings = strlab ;色棒标签
非规则等值线部分暂不需要
移动色棒位置,一般在overlay情况下需要进行调整
cnres@pmLabelBarOrthogonalPosF = 0.05
默认0.02
pmLabelBarParallelPosF
默认0.5
Vector
gsn_csm_vector_map_polar
北半球极区上叠加矢量
特殊的经度标签
这些经度标签是特别的,它们只能被一些gsnPolar* resources控制和调整
“tm” tickmark resources 在这里不起作用
使用的resources:
gsnPolar, gsnLeftString, gsnRightString
example
begin
a = addfile("atmos.nc","r")
u = a->U(0,15,:,:) ; 读第一个时次
v = a->V(0,15,:,:) ;.和第15层
wks = gsn_open_wks("ps",”vector2b”)
res = True
res@gsnPolar = "NH" ; Northern hemisphere
res@gsnLeftString = "Zonal Wind" ; Left subtitle
左上方字符串(内容)
res@gsnRightString = "meters/second" ; Right subtitle
右上方字符串(单位)
; res@gsnCenterString = " " ; Not used here
plot = gsn_csm_vector_map_polar(wks,u,v,res)
end
其余参数
res@vcRefMagnitudeF = 20 ; 矢量的大小
res@vcRefLengthF = 0.09 ; 参考矢量的大小
res@vcMinDistanceF = 0.02 ; 最小距离,箭头之间密集度
res@vcRefAnnoOrthogonalPosF = -.535 ; 将ref移至plot内
res@vcGlyphStyle = “CurlyVector” ; 打开curly vectors
res@vcLineArrowThicknessF = 3 ; 3倍粗
res@vcGlyphStyle = “CurlyVectors”
res@vcMonoVectorLineColor = False
res@gsnSpreadColors = True
vcres@vcRefAnnoOn = False ;默认True,若为假,则不画reference vector
Streamline
plot2 = gsn_csm_streamline_map(wks2,u,v,res2)
将风场画为矢量、流线
矢量、流线、风场等
http://www.ncl.ucar.edu/Applications/overlay.shtml
多种图叠加示例
example
wks2 = gsn_open_wks("png","2-stremline")
res2 = True
res2@gsnMaximize = True
res2@stMinArrowSpacingF = 0.05
res2@stMinDistanceF = 0.05
res2@stArrowLengthF = 0.01
res2@gsnLeftString = "JJA"
res2@gsnRightString = "m/s"
res2@gsnCenterString = "Mean wind field distribution (1981-2010,500hPa)"
plot2 = gsn_csm_streamline_map(wks2,u,v,res2)
Overlays
用“overlay” 程序将矢量、等值线等叠加至其他图形上
必须有坐标数组信息(规则)或设置了sfXArray/sfYArray/vfXArray/vfYArray(不规则)
生成各个子图,再叠加
example
wks = gsn_open_wks("x11","overlay1d")
res = True ;---Resource list 用以共享.
res@gsnDraw = False ; don't draw
res@gsnFrame = False ; don't advance frame
mpres = res ; 复制 Resource,其余属性另行配置
cnres = res
vcres = res
map = gsn_csm_map(wks,mpres)
contours = gsn_csm_contour(wks,speed,cnres)
vectors = gsn_csm_vector(wks,u,v,vcres)
; Overlay 矢量和等值线至地图上
overlay(map,contours)
overlay(map,vectors)
; 最后绘制地图时,也会同时绘制等值线和矢量
draw(map)
frame(wks)
gsn_csm_map
mpDataBaseVersion
mpLimitMode
mpMinLatF
mpMaxLatF
mpMinLonF
mpMaxLonF
mpFillOn
example
begin
wks = gsn_open_wks("ps","poly3c") ; 打开workstation
res = True
res@gsnMaximize = True ; 在页中最大化图形
res@mpFillOn = False ; 将绘制陆地边界线,不填充
res@mpDataBaseVersion = "MediumRes" ; 中等分辨率
res@mpDataSetName = "Earth..4" ; 有其他国家的分类
res@mpOutlineBoundarySets = "AllBoundaries"
res@mpLimitMode = "LatLon"
res@mpMinLatF = -45 ; 放大澳大利亚
res@mpMaxLatF = -10
res@mpMinLonF = 112
res@mpMaxLonF = 155
res@tiMainString = "Australian states and territories”
map = gsn_csm_map(wks,res) ; Draw map
end
写为函数
function Australia_map(wks,mode:string)
local res
begin
res = True ; 建立resource list
if(mode.eq."create") then
res@gsnFrame = False
res@gsnDraw = False
end if
res@gsnMaximize = True
res@mpFillOn = False
res@mpDataBaseVersion = "MediumRes"
res@mpDataSetName = "Earth..4"
res@mpOutlineBoundarySets = "AllBoundaries"
res@mpLimitMode = "LatLon"
res@mpMinLatF = -45
res@mpMaxLatF = -10
res@mpMinLonF = 112
res@mpMaxLonF = 155
res@tiMainString = "Australian states and territories"
map = gsn_csm_map(wks,res) ; Create draw default map
return(map)
end
;--Main code
begin
wks = gsn_open_wks("ps","poly3d")
map = Australia_map(wks,"draw")
end
Primitives
类型
markers
记号
example
;---生成地图,后添加线条、字符和记号.
map = Australia_map(wks,"create")
mres = True
mres@gsMarkerSizeF = 20. ; 放大记号
mres@gsMarkerColor = "blue”
dum = gsn_add_polymarker(wks,map,lon,lat,mres)
draw(map)
绘制地图和记号.
frame(wks)
若为其他类型,比如
res@gsnDraw = False
res@gsnFrame = False
plot = gsn_csm_contour_map(wks,Height,res)
dum1 = gsn_add_polymarker(wks,plot,lon,lat,mres)
draw(plot)
frame(wks)
polylines
线条
polygons
多边形(填色的)
text
文本
example
tres = True
tres@txFontHeightF = 0.015 ; Default is large
tres@txJust = "CenterLeft"
第一个"top", "center", "bottom"
垂直对齐
第二个"left", "center", "right"
水平对齐
Default: CenterCenter
dum2 = gsn_add_text(wks,plot,information,lon,lat-5,tres)
gsn_add_shapefile_polylines(wks,plot,shp_name,res)
wks [1] : graphic,
plot [*] : graphic,
shp_name [1] : string,
res [1] : logical
gsLineColor
颜色
gsLineDashPattern
模式
gsLineThicknessF
粗细
Functions
gsn_add_polygon, gsn_add_polyline, gsn_add_polymarker, gsn_add_text
可添加primitives至任何已存在的等值线、矢量、箭头、流线、XY或地图的图形中
从每一个primitive function 中返回值必须是唯一的
记号,线条和多边形的resources以“gs”开始
(gsMarkerColor, gsLineThicknessF, gsFillColor, gsEdgesOn, etc.)
文本的resources以“tx”开始
(txFontHeightF, txJust, txFont, txFontColor, etc.)
Specialized plots
skew-T
wind roses
bar charts
taylor diagrams
Panel plots
gsn_panel
Special topic: paneling plots (在一页中绘制多个 plots)
Plots 必须是同样的大小!
可以设置公用的labelbar, 图题
需再次提到的resources:gsnDraw, gsnFrame
如果绘制不同大小,请使用vpXF,vpYF,vpWidthF,vpHeightF resources
example
res@gsnDraw = False ; Don't draw plots
res@gsnFrame = False ; Don't advance frames
plot1 = gsn_csm_contour(wks,p(0,:,:),res)
plot2 = gsn_csm_contour(wks,p(3,:,:),res)
plot3 = gsn_csm_contour(wks,p(5,:,:),res)
plot4 = gsn_csm_contour(wks,p(7,:,:),res)
; Create a panel of plots with 2 rows and 2 columns.
gsn_panel(wks,(/plot1,plot2,plot3,plot4/),(/2,2/),False)
or
plots = new(4,graphic) ; 用数组表示
plots(0) = gsn_csm_contour(wks,p(0,:,:),res)
plots(1) = gsn_csm_contour(wks,p(3,:,:),res)
plots(2) = gsn_csm_contour(wks,p(5,:,:),res)
plots(3) = gsn_csm_contour(wks,p(7,:,:),res)
统一设置等值线数值
res@cnLevelSelectionMode = "ManualLevels”
res@cnMinLevelValF = -10
res@cnMaxLevelValF = 20
res@cnLevelSpacingF = 2
小标题
plots = new(4,graphic)
do i=0,3
res@tiMainString = "bottom-top index " + i
plots(i) = gsn_csm_contour(wks,p(i,:,:),res)
end do
其他设置
res@lbOrientation = "Vertical" ; Vertical labelbar
res@lbLabelBarOn = False ; 关闭各个plot的labelbar
res@cnInfoLabelOn = False ; 不绘制等值线的信息标签(信息标签好像只在panel中才会显示,单独画一张contour不会出现信息标签)
pres = True ; 设置 panel resources.
pres@gsnMaximize = True ; 在panel中最大化plots.
pres@gsnPanelLabelBar = True ; 打开 panel labelbar.
;pres@pmLabelBarWidthF = 0.8 ; 改变 labelbar 宽度.
pres@txString = "Perturbation pressure (hPa)"
pres@gsnPanelFigureStrings = "b_t index " + ispan(0,3,1))
图题(在图右下角)
gsn_panel(wks,plots,(/2,2/),pres)
出现问题
所有plots是一样大小么? 如果不是,也许需要设置
res@gsnPanelScalePlotIndex
res@gsnPanelDebug = True
屏幕输出关于paneled plots大小和位置 debug 信息
res@gsnPanelBoxes = True
绘制边界boxes,这样可以看出真实大小
res@gsnPanelXF 和/或 res@gsnPanelYF
可以强制plots 排列
使用vpXF/vpYF/vpWidthF/vpHeightF 以替代gsn_panel
etc.
Special topic
图形定位
NCL 在一个单位[0.,1.]平方范围内绘图
除有地图的图形外,图形默认的是正方形
图形(不包括标签、坐标刻度以及它们之外的地方)被包围的方块称“viewport”
纵横比调整,用viewport (“vp”) resources: vpWidthF和vpHeightF
0-1之间
图形通过左上角来定位
改变位置,用vpXF 和vpYF
vpXF
从左到右,0-1
vpYF
从上到下,0-1
图形的其他方面会自动调整
frame程序
主要的绘图函数在绘图时默认进行翻页(advance the frame or page)
如果需要继续在同一页中绘图,则需关掉翻页
可通过resource “gsnFrame” and procedure “frame”来完成
example
example
res@gsnFrame = False ; 不翻页
res@vpXF = 0.08 ; 靠近页的左边界
plot = gsn_csm_y(wks,y1,res)
res@vpXF = 0.57 ; 超过一半
plot = gsn_csm_y(wks,y2,res)
frame(wks) ; 现在翻页
如果前面设置了不翻页,后面必须调用“frame” procedure
有时搭配
res@gsnDraw = False
draw(plot)
先画,再翻页!
maximize_output(wks,True)
可以代替
;draw(map)
;frame(wks)
图形大小
默认设置中,图形不会被放大
如果想最大化,设置:
res@gsnMaximize = True
纵横比会保留, 但图形的位置和大小会改变
默认设置中,如果PS和PDF图形更适合“landscape”输出,则图形会被旋转
设置纸张大小
用“wkPaperSize” resource 可得到A4纸大小
wtype = "ps"
wtype@wkPaperSize = "a4"
wks = gsn_open_wks(wtype,”example”)