【发布时间】:2014-12-22 20:58:55
【问题描述】:
我需要从this NetCDF 文件 (1.1MB) 中绘制一些数据。
该文件包含一个 413x229 的网格(94577 个点)。每个点都有一个降水值,我需要用正确的 LAT-LON 打印。网格不一定是恒定的,因此我们有两个额外的 413x229 变量(xlat 和 xlon),其中包含每个网格点的 lat-lon 值。
感谢这些问题的提示...
- How to plot contours on a map with ggplot2 when data is on an irregular grid?
- R - Plotting netcdf climate data
- Plotting netcdf in R with correct grid
- How to plot latitude/longitude points over netcdf map
- Plotting netcdf in R with correct grid
- how to display a projected map on an R::lattice::layerplot?
...使用 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 将返回“向量太大”错误并且不绘制任何内容。
pr、lat 和 lon 是 413x229 数组。
所以,问题:
- 我做错了什么?
- 如何在 ggplot 中轻松自定义固定的非连续等高线级别?
- 如何叠加绘制区域的政治地图? (阿尔卑斯山)我还没有研究这个,因为它是次要的。它可能会在上面列出的问题之一中得到回答,因此请随意忽略它。
编辑:
答案建议我应该使用 raster 和 rasterVis 包。
但是,我不确定如何做到这一点。该文件不提供更多信息。我知道这是一个 Lambert Conformal 投影:
latitude_of_projection_origin = 39.
longitude_of_projection_origin = 14.
standard_parallel = 35., 51.
grid_factor = 0.684241343018562
你可以通过“ncdump -h”看到这个。
但是我不明白如何在正确的经纬度网格上使用 levelplot() 来绘制它。这对我来说真的很麻烦。我知道如何在 GrADS 中非常简单地做到这一点,但 GrADS 非常有限,我宁愿避免诚实地使用它。
【问题讨论】:
-
如果你没有迷上ggplot2,你应该能够使用raster和rasterVis简单地回避这些问题b> 包。 raster 允许您对太大而无法加载到内存中的文件进行操作,
rasterVis::levelplot()采用maxpixels=参数,可以加快绘制非常大的数据集的速度。