R - 绘制netcdf气候数据

fjd*_*fjd 4 maps r netcdf

我一直在尝试绘制以下网格化netcdf文件:"air.1999.nc"在以下网站上找到:

http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.html

我根据我在这里和其他地方找到的答案尝试了下面的代码,但没有运气.

library(ncdf);
temp.nc <- open.ncdf("air.1999.nc");
temp <- get.var.ncdf(temp.nc,"air");

temp.nc$dim$lon$vals -> lon
temp.nc$dim$lat$vals -> lat

lat <- rev(lat)
temp <- temp[nrow(temp):1,]

temp[temp==-32767] <- NA
temp <- t(temp)

image(lon,lat,temp)
library(maptools)
data(wrld_simpl)
plot(wrld_simpl, add = TRUE)
Run Code Online (Sandbox Code Playgroud)

这段代码是从这里找到的代码修改而来的:来自netcdf文件的变量出现了翻转

有没有人对使用这些类型的netcdf文件有任何想法或经验?谢谢

pla*_*pus 7

在这个问题您链接整个部分来自lat <- rev(lat)temp <- t(temp)非常具体到特定的数据集的OP和绝对没有普世价值.

temp.nc <- open.ncdf("~/Downloads/air.1999.nc")
temp.nc
[1] "file ~/Downloads/air.1999.nc has 4 dimensions:"
[1] "lon   Size: 144"
[1] "lat   Size: 73"
[1] "level   Size: 12"
[1] "time   Size: 365"
[1] "------------------------"
[1] "file ~/Downloads/air.1999.nc has 2 variables:"
[1] "short air[lon,lat,level,time]  Longname:Air temperature Missval:32767"
[1] "short head[level,time]  Longname:Missing Missval:NA"
Run Code Online (Sandbox Code Playgroud)

从这些信息中可以看出,在您的情况下,缺失值由值表示,32767因此以下应该是您的第一步:

temp <- get.var.ncdf(temp.nc,"air")
temp[temp=="32767"] <- NA
Run Code Online (Sandbox Code Playgroud)

另外,在您的情况下,您的数据有4个维度,而不仅仅是2个,它们是经度,纬度,等级(我假设代表高度)和时间.

temp.nc$dim$lon$vals -> lon
temp.nc$dim$lat$vals -> lat
temp.nc$dim$time$vals -> time
temp.nc$dim$level$vals -> lev
Run Code Online (Sandbox Code Playgroud)

如果您看一下,lat您会看到值是反向的(这image将是皱眉)所以让我们反过来:

lat <- rev(lat)
temp <- temp[, ncol(temp):1, , ] #lat being our dimension number 2
Run Code Online (Sandbox Code Playgroud)

然后经度从0到360表示,这不是标准的,它应该是-180到180所以让我们改变:

lon <- lon -180
Run Code Online (Sandbox Code Playgroud)

所以现在让我们绘制1000级(即第一个)和第一个日期的数据:

temp11 <- temp[ , , 1, 1] #Level is the third dimension and time the fourth.
image(lon,lat,temp11) 
Run Code Online (Sandbox Code Playgroud)

然后让我们叠加一张世界地图:

library(maptools)
data(wrld_simpl)
plot(wrld_simpl,add=TRUE)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • lon调整不正确.你可以在太平洋看到非洲.应该是`lon [lon> 180] < - lon [lon> 180] - 360``,我相信. (3认同)