用离散色标绘制填充的等高线图

时间:2014-11-05 13:56:41

标签: r ggplot2 raster netcdf

感谢this回答,我已经能够使用正确的投影和叠加图来绘制NetCDF文件中的地图。 但是,当使用ggplot绘制填充轮廓图时,我遇到了错误。 (参见输入文件的链接答案)

#See https://gis.stackexchange.com/questions/120900/plotting-netcdf-file-using-lat-and-lon-contained-in-variables

# First, estimate the extent.
# We start with the lat and long, then project it to the Lambert Conformal projection
library(raster)
inputfile <- "file.nc"

# Grab the lat and lon from the data
lat <- raster(inputfile, varname="xlat")
lon <- raster(inputfile, varname="xlon")

# Convert to points and match the lat and lons
plat <- rasterToPoints(lat)
plon <- rasterToPoints(lon)
lonlat <- cbind(plon[,3], plat[,3])

# Specify the lonlat as spatial points with projection as long/lat
lonlat <- SpatialPoints(lonlat, proj4string = CRS("+proj=longlat +datum=WGS84"))

# Need the rgdal package to project it to the original coordinate system
library("rgdal")

# My best guess at the proj4 string from the information given
mycrs <- CRS("+proj=lcc +lat_1=35.00 +lat_2=51.00 +lat_0=39.00 +lon_0=14.00 +x_0=-6000. +y_0=-6000. +ellps=sphere +a=6371229. +b=6371229. +units=m +no_defs")
plonlat <- spTransform(lonlat, CRSobj = mycrs)
# Take a look
plonlat
extent(plonlat)

# Yay! Now we can properly set the coordinate information for the raster
pr <- raster(inputfile, varname="pr")
# Fix the projection and extent
projection(pr) <- mycrs
extent(pr) <- extent(plonlat)
# Take a look
pr
plot(pr)

# Project to long lat grid
r <- projectRaster(pr, crs=CRS("+proj=longlat +datum=WGS84"))

library(rasterVis)
#Plot with ggplot:
#Add an overlay map
library(maps)
world    <-data.frame(map(plot=FALSE)[c("x","y")])
gplot(r*86400) + 
  geom_tile(aes(fill=value)) + 
  scale_fill_discrete() + 
  geom_path(aes(x,y), data=world) + 
  coord_equal(xlim=c(xmin(r), xmax(r)), ylim=c(ymin(r), ymax(r)))

Error: Continuous value supplied to discrete scale
这是因为我想绘制具有离散颜色的离散等高线图,而不是连续的色标。当然,如果使用scale_fill_continuous,它会起作用 我不能使用fill=factor(value)因为它需要很长时间(和GB的内存)然后返回我的颜色条目为数据集中的每个单独的不同值。我可以手动创建一些&#34; bins&#34;并修改数据集以适应这些,但我觉得这将是一个更简单的解决方案的解决方法。

我错过了什么简单优雅的解决方案?我不应该使用geom_tile(或geom_raster)吗?

编辑: Thsi是我想要获得的pdf示例: https://copy.com/yMDzEt4i1ELMxpca 该图是使用GrADS创建的。颜色图例的存在与否并不重要,有时我会使用它有时候我不会。

EDIT2: cut(value)可以做,但正如我所说,我喜欢ggplot解决方案,另外......

...是它产生的一个例子。我喜欢这些颜色之间的标签,而不是上面的颜色,如下所示:

1 个答案:

答案 0 :(得分:1)

根据您的修改,我会执行以下操作:

r$value.bin <- cut(r$value, c(0:4, 2 * (3:5)))
gplot(r*86400) + 
    geom_tile(aes(fill = value.bin)) + 
    scale_fill_manual(
       values = colorRampPalette(brewer.pal(9, "Greens"))(nlevels(r$value.bin))) + 
    geom_path(aes(x,y), data=world) + 
    coord_equal(xlim=c(xmin(r), xmax(r)), ylim=c(ymin(r), ymax(r)))

也许你必须使用scale_fill_manual中的颜色和切割,以便有一些NA颜色的斑点。