我是R的新手,我试图用R绘制网格几天,但不成功。 我在我所在的地区获得了ecmwf ERA Interim 2013年的降水数据,因为我的ncdf文件的尺寸长度不同,我无法绘制网格。如果有人可以帮助我真的很棒。
Google云端硬盘中我的.nc数据:https://drive.google.com/file/d/0B0X5ssvd281gUnIyUkZHRGs1a0k/edit?usp=sharing
我使用代码:
> library(ncdf)
> precipitation = open.ncdf("precipitation_2013.nc")
> lonmat = get.var.ncdf(nc= precipitation,varid="longitude")
> latmat = get.var.ncdf(nc= precipitation,varid="latitude")
> plot(lonmat, latmat, main= "Precipitation grid 2013")
感谢您的帮助:)
答案 0 :(得分:0)
我从未处理过geo-NetCDF文件,但是当你查看文件时,你会看到实际发生的事情:
print(precipitation)
[1] "file ~/Downloads/precipitation_2013.nc has 3 dimensions:"
[1] "longitude Size: 8"
[1] "latitude Size: 5"
[1] "time Size: 730"
[1] "------------------------"
[1] "file ~/Downloads/precipitation_2013.nc has 1 variables:"
[1] "short tp[longitude,latitude,time] Longname:Total precipitation Missval:-32767"
您的实际数据有一个short
类型的变量,其中包含三个维longitude
,latitude
和time
。维度的值存储为单独的变量,而收集值的变量仅引用维度。所以这个问题独立于 NetCDF 或地理信息系统问题:这是什么,你实际上想要在拥有值时绘图
> latmat
[1] 60.0 58.5 57.0 55.5 54.0
> lonmat
[1] 19.5 21.0 22.5 24.0 25.5 27.0 28.5 30.0
您可以通过提取实际变量来构建数据,将其以长格式显示,并将维值分配给生成的data.frame
:
library(reshape2)
tp.molten <- melt(get.var.ncdf(nc= precipitation,varid="tp"), varnames=c("longitude", "latitude", "time"))
tp.molten$longitude <- lonmat[tp.molten$longitude]
tp.molten$latitude <- lonmat[tp.molten$latitude ]
tp.molten$time<- get.var.ncdf(nc= precipitation,varid="time")[tp.molten$time ]
close.ncdf( precipitation ) # don't forget
head(tp.molten)
longitude latitude time value
1 19.5 19.5 990564 0.002813700
2 21.0 19.5 990564 0.004143370
3 22.5 19.5 990564 0.006473583
4 24.0 19.5 990564 0.008655690
5 25.5 19.5 990564 0.007778240
6 27.0 19.5 990564 0.005223891
现在你可以通过一个时间点将这些数据子集化并在lon-lat-grid上绘制
library(ggplot2)
ggplot( data = tp.molten[ tp.molten$time == 992052, ], aes( x = latitude, y = longitude, fill = value ) ) +
geom_raster()