将栅格添加到 ggmap 底图:在 ggplot2 中将 alpha(透明度)和填充颜色设置为 inset_raster()
Add raster to ggmap base map: set alpha (transparency) and fill color to inset_raster() in ggplot2
我想在 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])
是否可以设置 alpha
并更改 fill
颜色?
结果如下所示:
我自己一直在调查这个问题。我遇到的问题是试图用栅格覆盖 ggmap 输出是以下错误:
Error: geom_raster only works with Cartesian coordinates.
解决此问题的方法是使用 coord_cartesian(),如下所示:
library(ggplot2)
library(ggmap)
bm <- ggmap(get_map(location = "Bangkok", maptype = "hybrid"))
bm <- bm + geom_raster(...) # insert your raster here
bm <- bm + coord_cartesian()
plot(bm)
我不确定你的光栅 r 来自哪里。为此,只需将栅格 r 转换为数据框并根据 geom_raster() 说明添加数据,确保坐标在 lat/long 中(即与地图相同)。
为了回答您的问题,您可以通过 geom_raster() 操作 alpha 和填充。
希望这对您有所帮助。
顺便说一句,这个解决方法最初是在 link 中提出的:
https://groups.google.com/forum/embed/#!topic/ggplot2/nqzBX22MeAQ
没有 fortify
甚至更快:
阅读原文 post 了解更多信息
从this blog entry我发现我们可以直接在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))
如果你只需要可视化一些东西,如何解决绘图速度问题
如下所述,对于大量像素,此类绘图可能会变得非常缓慢。因此,您可能会考虑在将其转换为多边形之前减少像素数量(在大多数情况下并不会真正减少地图中的信息量)。因此,raster::aggregate
可以用来将像素数减少到一个合理的数量。
该示例显示了像素数如何减少 4 个数量级(即 2 * 2,水平 * 垂直)。有关详细信息,请参阅 ?raster::aggregate
。
r <- aggregate(r, fact = 2)
# afterwards continue with rasterToPolygons(r)...
原文Post:
过了一段时间,我找到了解决这个问题的方法。 将栅格转换为多边形! 这个想法基本上是在 Marc Needham's blog post 之后实现的。
但是,有一个缺点: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))
结果如下:
我想在 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])
是否可以设置 alpha
并更改 fill
颜色?
结果如下所示:
我自己一直在调查这个问题。我遇到的问题是试图用栅格覆盖 ggmap 输出是以下错误:
Error: geom_raster only works with Cartesian coordinates.
解决此问题的方法是使用 coord_cartesian(),如下所示:
library(ggplot2)
library(ggmap)
bm <- ggmap(get_map(location = "Bangkok", maptype = "hybrid"))
bm <- bm + geom_raster(...) # insert your raster here
bm <- bm + coord_cartesian()
plot(bm)
我不确定你的光栅 r 来自哪里。为此,只需将栅格 r 转换为数据框并根据 geom_raster() 说明添加数据,确保坐标在 lat/long 中(即与地图相同)。
为了回答您的问题,您可以通过 geom_raster() 操作 alpha 和填充。
希望这对您有所帮助。
顺便说一句,这个解决方法最初是在 link 中提出的: https://groups.google.com/forum/embed/#!topic/ggplot2/nqzBX22MeAQ
没有 fortify
甚至更快:
阅读原文 post 了解更多信息
从this blog entry我发现我们可以直接在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))
如果你只需要可视化一些东西,如何解决绘图速度问题
如下所述,对于大量像素,此类绘图可能会变得非常缓慢。因此,您可能会考虑在将其转换为多边形之前减少像素数量(在大多数情况下并不会真正减少地图中的信息量)。因此,raster::aggregate
可以用来将像素数减少到一个合理的数量。
该示例显示了像素数如何减少 4 个数量级(即 2 * 2,水平 * 垂直)。有关详细信息,请参阅 ?raster::aggregate
。
r <- aggregate(r, fact = 2)
# afterwards continue with rasterToPolygons(r)...
原文Post:
过了一段时间,我找到了解决这个问题的方法。 将栅格转换为多边形! 这个想法基本上是在 Marc Needham's blog post 之后实现的。
但是,有一个缺点: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))
结果如下: