将栅格添加到ggmap基本地图:在ggplot2中设置alpha(透明度)并将颜色填充到inset_raster()

lok*_*oki 9 plot r geospatial ggplot2 ggmap

我想在ggplot2中使用覆盖GoogleMaps基本地图的栅格绘制地图.因此,我用get_map()insert_raster()这样的:

library(ggplot2)
library(ggmap)

bm <- ggmap(get_map(location = "Bangkok", maptype = "hybrid"))

bm + inset_raster(as.raster(r), xmin = r@extent[1], xmax = r@extent[2],
                  ymin = r@extent[3], ymax = r@extent[4])
Run Code Online (Sandbox Code Playgroud)

是否有可能设置alpha和更改fill颜色?

结果如下: 在此输入图像描述

lok*_*oki 10

更快,没有fortify:

阅读下面的原始帖子以获取更多信息

这篇博文中我发现我们可以直接使用空间多边形ggplot::geom_polygon()

r <- raster(system.file("external/test.grd", package="raster"))
# just to make it reproducible with ggmap we have to transform to wgs84
r <- projectRaster(r, crs = CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))

rtp <- rasterToPolygons(r)

bm <- ggmap(get_map(location = bbox(rtp), maptype = "hybrid", zoom = 13))
bm + 
  geom_polygon(data = rtp, 
               aes(x = long, y = lat, group = group, 
                   fill = rep(rtp$test, each = 5)), 
               size = 0, 
               alpha = 0.5)  + 
  scale_fill_gradientn("RasterValues", colors = topo.colors(255)) 
Run Code Online (Sandbox Code Playgroud)

如果你只需要想象一些东西,如何处理绘制SPEED

如下所述,对于大量像素,这种绘图可能变得非常慢.因此,在将其转换为多边形之前,您可以考虑减少像素数(在大多数情况下,这不会真正减少地图中的信息量).因此,raster::aggregate可以用来将像素数减少到合理的数量.

该示例示出了像素数量如何减少4的量级(即2*2,水平*垂直).欲了解更多信息,请参阅?raster::aggregate.

r <- aggregate(r, fact = 2)
#  afterwards continue with rasterToPolygons(r)...
Run Code Online (Sandbox Code Playgroud)

原帖:

过了一会儿,我找到了解决这个问题的方法.将栅格转换为多边形!这个想法基本上是在Marc Needham的博客文章之后实现.

然而,有一个缺点:ggplot因大量多边形而变得非常慢,你将不可避免地面对这些多边形.但是,您可以通过绘制到png()(或其他)设备来加快速度.


这是一个代码示例:

library(raster)
library(ggplot2)
library(ggmap)

r <- raster(....) # any raster you want to plot
rtp <- rasterToPolygons(r)
rtp@data$id <- 1:nrow(rtp@data)   # add id column for join

rtpFort <- fortify(rtp, data = rtp@data)
rtpFortMer <- merge(rtpFort, rtp@data, by.x = 'id', by.y = 'id')  # join data

bm <- ggmap(get_map(location = "Shanghai", maptype = "hybrid", zoom = 10))

bm + geom_polygon(data = rtpFortMer, 
                  aes(x = long, y = lat, group = group, fill = layer), 
                  alpha = 0.5, 
                  size = 0) +  ## size = 0 to remove the polygon outlines
     scale_fill_gradientn(colours = topo.colors(255))
Run Code Online (Sandbox Code Playgroud)

这导致如下所示:

在ggmap基本地图上使用alpha的栅格