Primer puesto aquí, espero estar observando la etiqueta del sitio web. No pude encontrar y responder en el sitio y previamente publiqué esto en un grupo específico de ggplot2, pero todavía no hay soluciones.ggplot2: el trazado de la trama no funciona como se esperaba al establecer los valores alfa
Básicamente estoy tratando de superponer dos rásteres usando ggplot2 y requiero que el superior sea semitransparente. Tengo un ráster hillShade que se calcula a partir de un ráster de datos de elevación, y deseo superponer el ráster de elevación en el ráster sombreado para que el gráfico resultante no parezca "plano". Puedes ver a qué me refiero en el código R reproducible a continuación.
Usando gráficos base puedo lograr el resultado deseado y he incluido un ejemplo en el código a continuación para aclarar lo que quiero decir, pero tengo que hacer esto en ggplot2.
No puedo hacer que funcione en ggplot2. La combinación de los rásteres hace que los colores se vuelvan divertidos (puedo trazar cada uno por sí solo). ¿Alguien puede ayudarme o apuntarme en la dirección correcta? Ejemplo de código autocontenido y reproducible incluido a continuación. (Perdón por la duración, pero pensé que sería mejor no tenerlo en cuenta).
# Load relevant libraries
library(ggplot2)
library(raster)
# Download sample raster data of Ghana from my Dropbox
oldwd <- getwd()
tmp <- tempdir()
setwd(tmp)
url1 <- "http://dl.dropbox.com/s/xp4xsrjn3vb5mn5/GHA_HS.asc"
url2 <- "http://dl.dropbox.com/s/gh7gzou9711n5q7/GHA_DEM.asc"
f1 <- file.path(tmp,"GHA_HS.asc")
f2 <- file.path(tmp,"GHA_DEM.asc")
download.file(url1,f1) #File is ~ 5,655Kb
download.file(url2,f2) #File is ~ 2,645Kb
# Create rasters from downloaded files
hs <- raster(f1)
dem <- raster(f2)
# Plot with base graphics to show desired output
plot(hs,col=grey(1:100/100),legend=F)
plot(dem,col=rainbow(100),alpha=0.4,add=T,legend=F)
# Convert rasters TO dataframes for plotting with ggplot
hdf <- rasterToPoints(hs); hdf <- data.frame(hdf)
colnames(hdf) <- c("X","Y","Hill")
ddf <- rasterToPoints(dem); ddf <- data.frame(ddf)
colnames(ddf) <- c("X","Y","DEM")
# Create vectors for colour breaks
b.hs <- seq(min(hdf$Hill),max(hdf$Hill),length.out=100)
b.dem <- seq(min(ddf$DEM),max(ddf$DEM),length.out=100)
# Plot DEM layer with ggplot()
p1 <- ggplot()+
layer(geom="raster",data=ddf,mapping=aes(X,Y,fill=DEM))+
scale_fill_gradientn(name="Altitude",colours = rainbow(100),breaks=b.dem)+
scale_x_continuous(name=expression(paste("Longitude (",degree,")")),limits=c(-4,2),expand=c(0,0))+
scale_y_continuous(name=expression(paste("Latitude (",degree,")")),limits=c(4,12),expand=c(0,0))+
coord_equal()
print(p1)
# Plot hillShade layer with ggplot()
p2 <- ggplot()+
layer(geom="raster",data=hdf,mapping=aes(X,Y,fill=Hill))+
scale_fill_gradientn(colours=grey(1:100/100),breaks=b.hs,guide="none")+
scale_x_continuous(name=expression(paste("Longitude (",degree,")")),limits=c(-4,2),expand=c(0,0))+
scale_y_continuous(name=expression(paste("Latitude (",degree,")")),limits=c(4,12),expand=c(0,0))+
coord_equal()
print(p2)
# Try to plot both together with transparency on the DEM layer
p3 <- ggplot(hdf)+
geom_raster(aes(X,Y,fill=Hill))+
scale_fill_gradientn(colours=grey(1:100/100),breaks=b.hs,guide="none")+
scale_x_continuous(name=expression(paste("Longitude (",degree,")")),limits=c(-4,2),expand=c(0,0))+
scale_y_continuous(name=expression(paste("Latitude (",degree,")")),limits=c(4,12),expand=c(0,0))+
geom_raster(data=ddf,aes(X,Y,fill=DEM),alpha=I(0.4))+
scale_fill_gradientn(name="Altitude",colours = rainbow(100),breaks=b.dem)+
coord_equal()
print(p3)
# Cleanup downloaded files and return to previous wd
unlink(tmp,recursive=T)
setwd(oldwd)
Mis preguntas son las siguientes:
P1: ¿Cómo puedo hacer que las capas de aspecto p3 como que cuando se representa con los gráficos de base en el ejemplo anterior?
Q2: ¿Cómo puedo especificar más sensiblemente las escalas de color, así que no tengo una leyenda ridícula en el RHS?
estoy seguro de que habría alguna manera de usar 'annotation_raster' - pero mis intentos han sido infructuosos hasta el momento. El motivo (según lo veo) para el fracaso de la trama combinada son las dos llamadas a 'scale_fill_gradientn' – mnel
que es el quid de la misma. parece que un 'ggplot' solo puede tener una estética' fill' y estética 'colour'.puede obtener algo que funcione de alguna manera haciendo que la capa DEM sea un 'geom_point' con' color = DEM' y luego use 'scale_colour_gradientn' en lugar de' scale_fill_gradientn', pero no se ve tan bien como la forma de gráficos base. –
¡Gracias por mirar mi problema, ustedes dos! @mplourde: Creo que ggplot2 puede tener una estética de relleno por capa, pero creo que cuando hay transparencia alfa, combina los colores usando una mezcla de colores aditiva donde las capas se superponen. De alguna manera, esta mezcla es diferente en ggplot2 que en los gráficos base. He estado pensando en ello y creo que lo que tengo que hacer es calcular manualmente los colores del valor de escala de grises correspondiente en el ráster hillShade (creo que esto es crominancia en el color hcl modelo) y el tono del trama DEM (creo que esto sería matiz). –