2012-06-24 18 views
15

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?

+0

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

+0

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. –

+0

¡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). –

Respuesta

11

Q1: No puede tener diferentes escalas de relleno en capas diferentes. Una solución es usar la estética de relleno para el DEM y la estética alfa para el sombreado. Desafortunadamente, geom_raster no parece usar la estética alfa de la manera que esperaba. Usted puede obtener el mismo efecto con geom_tile, sólo se necesita más tiempo:

ggplot(hdf) + 
    geom_raster(data=ddf,aes(X,Y,fill=DEM)) + 
    scale_fill_gradientn(name="Altitude",colours = rainbow(100),breaks=b.dem) + 
    geom_tile(aes(X,Y,alpha=Hill), fill = "grey20") + 
    scale_alpha(range = c(0, 0.5)) + 
    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() 

Q2: Salida ?guide_colorbar. No funciona muy bien con sus 100 descansos de color, pero con menos es bastante bueno.

ggplot(hdf)+ 
    geom_raster(data=ddf,aes(X,Y,fill=DEM))+ 
    scale_fill_gradientn(name="Altitude",colours = rainbow(20))+ 
    guides(fill = guide_colorbar()) + 
    geom_tile(aes(X,Y,alpha=Hill), fill = "grey20") + 
    scale_alpha(range = c(0, 0.5)) + 
    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() 

DEM plus hill shading and colorbar legend

+0

muchas gracias por su tiempo y esfuerzo para arreglar mis esfuerzos de codificación. Esto funciona muy bien para mis propósitos. ¡Muchas gracias! :-) –

3

La alfa en la trama será apoyado en la próxima versión, por lo que se puede dibujar por:

ggplot(NULL, aes(X, Y)) + 
    geom_raster(data = ddf, aes(fill = DEM)) + 
    geom_raster(data = hdf, aes(alpha = Hill)) + 
    scale_fill_gradientn(name="Altitude",colours = rainbow(20))+ 
    guides(fill = guide_colorbar()) + 
    scale_alpha(range = c(0, 0.5), 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() 

de todos modos, muy bonito terreno.

Si desea utilizar esto inmediatamente, intente instalar de GitHub:

library(devtools) 
install_github("ggplot2", "kohske", "fix/geom-raster-alpha") 

Tenga en cuenta que geom_tile y geom_raster un aspecto diferente en algunos dispositivos. Quizás la trama es mejor para su propósito.

enter image description here

+0

¡Gracias! Con esta solución ahora puedo trazar exactamente lo que necesito. Muchas gracias. Saludos, Simon. –

+0

¿Alguien tiene alguna idea de cómo puede ajustar los colores en la leyenda para que coincida con los colores en el mapa ahora que está enmascarado con un gris? – Dominik

+0

Tenía el problema de salida de archivo (PDF) con ráster "borroso" cuando se usa geom_raster() en lugar de geom_tile(). Este último solucionó el problema. Thx por el comentario. – Shadow

Cuestiones relacionadas