将光栅添加到ggmap底图:在ggplot2中将alpha(透明度)和填充颜色设置为inset_raster() [英] Add raster to ggmap base map: set alpha (transparency) and fill color to inset_raster() in ggplot2

查看:16
本文介绍了将光栅添加到ggmap底图:在ggplot2中将alpha(透明度)和填充颜色设置为inset_raster()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

库(ggplot2)图书馆(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])

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

结果如下:

解决方案

即使没有 fortify 也更快:

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

来自

I want to plot a map with a raster overlaying a GoogleMaps base map in ggplot2. Therefore, I used get_map() and insert_raster() like this:

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])

Is there any possibility to set a alpha and change the fill color?

The result looks like this:

解决方案

Even Faster without fortify:

read the original post below for further information

From this blog entry I found that we can use spatial polygons directly in 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)) 

How to tackle plotting SPEED if you just need to visualize something

As described below, such plotting might become very slow with large numbers of pixels. Therefore, you might consider to reduce the number of pixels (which in most cases does not really decrease the amount of information in the map) before converting it to polygons. Therefore, raster::aggregate can be used to reduce the number of pixels to a reasonable amount.

The example shows how the number of pixels is decreased by an order of 4 (i.e. 2 * 2, horizontally * vertically). For further information see ?raster::aggregate.

r <- aggregate(r, fact = 2)
#  afterwards continue with rasterToPolygons(r)...

Original Post:

After a while, I found a way to solve this problem. Converting the raster to polygons! This idea then basically was implemented after Marc Needham's blog post.

Yet, there is one drawback: ggplot gets really slow with large numbers of polygons, which you will inevitably face. However, you can speed things up by plotting into a png() (or other) device.


Here is a code example:

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

This results in something like this:

这篇关于将光栅添加到ggmap底图:在ggplot2中将alpha(透明度)和填充颜色设置为inset_raster()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆