我需要从this NetCDF文件(1.1MB)中绘制一些数据。
该文件包含413x229网格(94577点)。每个点都有一个降水值,我需要在正确的LAT-LON中打印。网格不一定是常数,因此我们有两个额外的413x229变量(xlat和xlon),包含每个网格点的lat-lon值。
感谢这些问题的提示......
...使用ggplot在任意网格上绘制数据非常简单:
library(ncdf4)
library(ggplot2)
library(reshape)
ncfile <- nc_open(inputfile.nc)
pr <- ncvar_get(ncfile, "pr")
pr <- pr*86400
mpr <- melt(pr)
ggplot(aes(x=X1, y=X2, fill=value), data=mpr) + geom_raster() + coord_equal()
这将产生一个带有网格的图,当然不是纬度。 但是,当尝试使用正确的网格绘制相同的数据时:
xlon <- ncvar_get(ncfile, "xlon")
xlat <- ncvar_get(ncfile, "xlat")
df <- data.frame(as.vector(lat), as.vector(lon), as.vector(pr))
ggplot(aes(x=lat, y=lon, fill=pr), data=df) + geom_raster() + coord_equal()
ggplot将返回&#34;向量太大&#34;错误,没有任何情节 pr,lat和lon是413x229阵列。
所以,问题:
编辑:
答案建议我应该使用raster
和rasterVis
包。
但是,我不确定如何做到这一点。该文件不再提供任何信息。我知道这是Lambert Conformal投影,其中包括:
latitude_of_projection_origin = 39.
longitude_of_projection_origin = 14.
standard_parallel = 35., 51.
grid_factor = 0.684241343018562
您可以通过&#34; ncdump -h&#34;。
看到这一点但是我不明白如何在正确的lat-lon网格上使用levelplot()
来绘制它。这对我来说真的很麻烦。我很清楚如何在GrADS中做到这一点,但GrADS非常有限,我宁愿避免诚实地使用它。
答案 0 :(得分:3)
我记得和你有过类似的问题。
这是我学到的:
据我所知,ggplot的geom_raster
只能在规则间隔的网格上绘图,如果你从栅格中拉出未经测量的纬度和经度,你可能没有规则间隔的网格情节。如果您设置使用ggplot绘制数据并且只有纬度和经度,则必须在绘图之前找到投影信息并将其投影到其原始的,规则间隔的网格。 ggplot使用mapproject
包提供的投影,并且不使用PROJ4投影库,我发现这些投影库在R中的其他空间包中更强大且受到普遍支持。
如果你正在使用常规网格,我认为你是,我建议使用raster
包,它可以直接读取netcdf4文件。对于简单的情节,请尝试:
library(raster)
r <- raster("your_nc_file_path", varname = "pr")
plot(r)
contour(r, add = TRUE)
如果你有一个正确制作的netcdf文件,你也可以使用proj4string(r)
或crs(r)
或projection(r)
提取投影信息。您可以将其翻译为与ggplot的投影系统一起使用。
另外,如果您真的想要在ggplot中绘制此图,请尝试使用rasterVis
包,这样可以方便地准备与ggplot一起使用的栅格。
library(rasterVis)
# Notice `g`plot (from rasterVis) and not `gg`plot
gplot(r) +
geom_tile(aes(fill = value))
希望有所帮助。