R - 覆盖国家边界的栅格数据集的等高线图

时间:2018-01-31 08:51:38

标签: r maps raster contour

我有一个相当简单且可能很常见的任务,在一个绘图中绘制带有countour行的栅格数据集并将国家边界添加到一起,但是我没有在任何地方找到解决方案。有一些提示(例如this one),但没有使用栅格数据集,我无法使其工作。 我使用的数据集实际上是netcdf格式,可用here(大小为15mb),包含大约40年的网格化降水数据。 这是我的代码行:

setwd("...netcdf Data/GPCP")
library("raster") 
library("maps")

nc_brick79_17 <- brick("precip.mon.mean.nc") # load in the ncdf data as a 
raster brick
newextent <- c(85, 125, -20, 20) # specify region of interest
SEA_brick <- crop(nc_brick79_17, newextent) # crop the region
day1 <- SEA_brick[[1]] # select very first day as example
colfunc<-colorRampPalette(c("white","lightblue","yellow","red","purple")) # colorscale for plotting

因此,当我只是将栅格数据与覆盖的地图一起绘制时,它当然有效:

plot(day1, col=(colfunc(100)), interpolate=F, main="day1",legend.args=list(text='mm/hr', side=4,font=1, line=2.5, cex=1.1))
map("world", add=TRUE, lwd=0.5, interior = FALSE, col = "black")

我们得到这个图(添加了国家边界的光栅图)

enter image description here

现在我用来生成轮廓图的代码如下:

filledContour(day1,zlim=c(0,20),color=colorRampPalette(c("white","lightblue","yellow","red","purple")), 
              xlab = "Longitude (°)", ylab = "Latitude (°)")
map("world", add=TRUE, lwd=0.5, interior = FALSE, col = "black") # add map overlay 

我最终得到了一个情节,显然国家边界没有对齐,甚至覆盖了颜色条。

地图叠加移动的轮廓图

enter image description here

在最后一部分中,我试图将国家边界添加到等高线图中,但它不起作用,即使我应该假设它。地图根本不存在,但没有错误:

filledContour(day1, zlim=c(0,20), 
               color.palette = colorRampPalette(c("white","lightblue","yellow","red","purple")), 
               xlab = "Longitude (°)", ylab = "Latitude (°)", 
               xlim = c(90, 120), ylim = c(-20, 20), nlevels = 25, 
               plot.axes = {axis(1); axis(2);    
               map('world', xlim = c(90, 120), ylim = c(-20, 20), add = TRUE, lwd=0.5, col = "black")})  

从这行代码中我得到了这个情节。

轮廓图但未添加国家/地区边框

enter image description here

我可以改进什么或者某处有任何错误?谢谢!

1 个答案:

答案 0 :(得分:2)

我选择在这里使用ggplot。我给你留了两张地图。第一个是你创建的那个。这是与ggplot的复制。第二个是你无法生产的。有很多事情需要解释。但我恐怕没有足够的时间来写所有内容。但我在下面的代码中留下了一些评论。请检查this question以了解有关第二个图形的更多信息。最后,我想赞扬hrbrmstr在链接问题中写了一个很好的答案。

library(maptools)
library(akima)
library(raster)
library(ggplot2)

# This is a data set from the maptools package
data(wrld_simpl)

# Create a data.frame object for ggplot. ggplot requires a data frame.

mymap <- fortify(wrld_simpl)

# This part is your code.

nc_brick79_17 <- brick("precip.mon.mean.nc")
newextent <- c(85, 125, -20, 20)
SEA_brick <- crop(nc_brick79_17, newextent)
day1 <- SEA_brick[[1]]


# Create a data frame with a raster object. This is a spatial class
# data frame, not a regular data frame. Then, convert it to a data frame.

spdf <- as(day1, "SpatialPixelsDataFrame")
mydf <- as.data.frame(spdf)
colnames(mydf) <- c("value", "x", "y")


# This part creates the first graphic that you drew. You draw a map.
# Then, you add tiles on it. Then, you add colors as you wish.
# Since we have a world map data set, we trim it at the end.

ggplot() +
geom_map(data = mymap, map = mymap, aes(x = long, y = lat, map_id = id), fill = "white", color = "black") +
geom_tile(data = mydf, aes(x = x, y = y, fill = value), alpha = 0.4) + 
scale_fill_gradientn(colors = c("white", "lightblue", "yellow", "red", "purple")) +
scale_x_continuous(limits = c(85, 125), expand = c(0, 0)) +
scale_y_continuous(limits = c( -20, 20), expand = c(0, 0)) +
coord_equal()

enter image description here

ggplot版本的filled.contour()

# As I mentioned above, you want to study the linked question for this part.

mydf2 <- with(mydf, interp(x = x, 
                           y = y, 
                           z = value,
                           xo = seq(min(x), max(x), length = 400),
                           duplicate = "mean"))

gdat <- interp2xyz(mydf2, data.frame = TRUE)

# You need to draw countries as lines here. You gotta do that after you draw
# the contours. Otherwise, you will not see the map.

ggplot(data = gdat, aes(x = x, y = y, z = z)) + 
geom_tile(aes(fill = z)) + 
stat_contour(aes(fill = ..level..), geom = "polygon", binwidth = 0.007) + 
geom_contour(color = "white") +
geom_path(data = mymap, aes(x = long, y = lat, group = group), inherit.aes = FALSE) +
scale_x_continuous(limits = c(85, 125), expand = c(0, 0)) +
scale_y_continuous(limits = c(-20, 20), expand = c(0, 0)) +
scale_fill_gradientn(colors = c("white", "lightblue", "yellow", "red", "purple")) +
coord_equal() +
theme_bw()

enter image description here