0

I'm trying to find a way to add alpha function for overlaying a raster layer on ggmap. There are some suggestions such as converting raster to shapefile, but I want to use the raster file. Is there any way for adding alpha and make the raster layer transparent?

library(raster)
library(ggmap)
location <- get_map(location = c(lon =22, lat =40), zoom = 6, maptype = "hybrid")
# get the raster layer
tmin <- raster::getData('worldclim', var='tmin', res=0.5, lon=22, lat=40)[[1]]
ggmap(location)+inset_raster(as.raster(tmin), xmin = tmin@extent[1], xmax = tmin@extent[2],ymin =tmin@extent[3], ymax = tmin@extent[4])+ coord_cartesian()

enter image description here

Geo-sp
  • 1,704
  • 3
  • 19
  • 42

1 Answers1

3

Some time ago I modified the rasterVis::gplot function to retrieve data to be plotted using classical {ggplot2} functions like geom_tile. Function is gplot_data in my {SDMSelect} package on github. If you do not want to get the complete package, you can directly use the function:

#' Transform raster as data.frame to be later used with ggplot
#' Modified from rasterVis::gplot
#'
#' @param x A Raster* object
#' @param maxpixels Maximum number of pixels to use
#'
#' @details rasterVis::gplot is nice to plot a raster in a ggplot but
#' if you want to plot different rasters on the same plot, you are stuck.
#' If you want to add other information or transform your raster as a
#' category raster, you can not do it. With `SDMSelect::gplot_data`, you retrieve your
#' raster as a data.frame that can be modified as wanted using `dplyr` and
#' then plot in `ggplot` using `geom_tile`.
#' If Raster has levels, they will be joined to the final tibble.
#'
#' @export

gplot_data <- function(x, maxpixels = 50000)  {
  x <- raster::sampleRegular(x, maxpixels, asRaster = TRUE)
  coords <- raster::xyFromCell(x, seq_len(raster::ncell(x)))
  ## Extract values
  dat <- utils::stack(as.data.frame(raster::getValues(x)))
  names(dat) <- c('value', 'variable')

  dat <- dplyr::as.tbl(data.frame(coords, dat))

  if (!is.null(levels(x))) {
    dat <- dplyr::left_join(dat, levels(x)[[1]],
                            by = c("value" = "ID"))
  }
  dat
}

Then, you add your raster with classical ggplot2::geom_tile:

library(raster)
library(ggmap)
location <- get_map(location = c(lon =22, lat =40), zoom = 6, maptype = "hybrid")
# get the raster layer
tmin <- raster::getData('worldclim', var='tmin', res=0.5, lon=22, lat=40)[[1]]

# library(SDMSelect) # If you want
tmin_data <- gplot_data(tmin, maxpixels = 10000) # Choose number of pixels


ggmap(location) +
  geom_tile(data = tmin_data, aes(x, y, fill = value), alpha = 0.5) +
  scale_fill_gradient(low = "green", high = "red")

Raster as transparent layer with {ggplot2}

Sébastien Rochette
  • 6,536
  • 2
  • 22
  • 43