使用ggplot2绘制NetCDF变量网格数据文件:“向量太大”错误

时间:2014-10-27 16:00:24

标签: r ggplot2 netcdf

我需要从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阵列。

所以,问题:

  1. 我做错了什么?
  2. 如何在ggplot中轻松自定义固定的非连续轮廓水平?
  3. 如何覆盖绘制区域的政治地图? (阿尔卑斯山)我还没有看到它,因为它是次要的。可以在上面列出的一个问题中回答,所以请随意忽略它。
  4. 编辑: 答案建议我应该使用rasterrasterVis包。 但是,我不确定如何做到这一点。该文件不再提供任何信息。我知道这是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非常有限,我宁愿避免诚实地使用它。

1 个答案:

答案 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))

希望有所帮助。