2012-07-31 21 views
5

me gustaría trazar una curva de densidad de 95% de espejo y el mapa de alfa a la densidad:ggplot2: establecer valores (no lineal) para el alfa

foo <- function(mw, sd, lower, upper) { 
x <- seq(lower, upper, length=500) 
dens <- dnorm(x, mean=mw, sd=sd, log=TRUE) 
dens0 <- dens -min(dens) 
return(data.frame(dens0, x)) 
} 

df.rain <- foo(0,1,-1,1) 

library(ggplot2) 


drf <- ggplot(df.rain, aes(x=x, y=dens0))+ 
geom_line(aes(alpha=..y..))+ 
geom_line(aes(x=x, y=-dens0, alpha=-..y..))+ 
stat_identity(geom="segment", aes(xend=x, yend=0, alpha=..y..))+ 
stat_identity(geom="segment", aes(x=x, y=-dens0, xend=x, yend=0, alpha=-..y..)) 
drf 

Esto funciona bien, pero me gustaría hacer el el contraste entre los bordes y el medio es más prominente, es decir, quiero que los bordes sean casi blancos y solo la parte del medio sea negra. He estado manipulando scale_alpha() pero sin suerte. ¿Algunas ideas?

Editar: En última instancia, me gustaría trazar varias gotas de lluvia, es decir, las gotas individuales serán pequeñas, pero el sombreado debe ser claramente visible.

+0

+1 por ejemplo código! –

Respuesta

0

Mientras analizaba tanto sus respuestas De hecho, me encontré exactamente lo que estaba buscando. La forma más fácil es simplemente usar scale_colour_gradientn con un vector de grises.

library(RColorBrewer) 
grey <- brewer.pal(9,"Greys") 

drf <- ggplot(df.rain, aes(x=x, y=dens0, col=dens0))+ 
stat_identity(geom="segment", aes(xend=x, yend=0))+ 
stat_identity(geom="segment", aes(x=x, y=-dens0, xend=x, yend=0))+ 
scale_colour_gradientn(colours=grey) 
drf 
4

En lugar de mapeo dens0 a la alpha, me asignarlo a color:

drf <- ggplot(df.rain, aes(x=x, y=dens0))+ 
    geom_line(aes(color=..y..))+ 
    geom_line(aes(x=x, y=-dens0, color=-..y..))+ 
    stat_identity(geom="segment", aes(xend=x, yend=0, color=..y..))+ 
    stat_identity(geom="segment", aes(x=x, y=-dens0, xend=x, yend=0, color=-..y..)) 

enter image description here

Ahora nos queda el contraste de color está presente principalmente en las colas. El uso de dos colores ayuda un poco (tenga en cuenta que el cambio en el color está en 0.25):

drf + scale_color_gradient2(midpoint = 0.25) 

enter image description here

Por último, a fin de incluir la distribución de los dens0 valores, baso el punto medio de la escala de color de el valor de la mediana de los datos:

drf + scale_color_gradient2(midpoint = median(df.rain$dens0)) 

enter image description here

Nota!: Pero, sin embargo, la forma en que ajusta sus datos, la mayor parte del contraste en sus datos se encuentra en los valores más extremos en su conjunto de datos. Intentar enmascarar esto jugando con una escala no lineal, o modificando una escala de colores como lo hice, podría presentar una imagen falsa de los datos reales.

+0

gracias Paul. He intentado todo eso antes, pero no estoy satisfecho con el resultado y me parece importante que se muestre en blanco y negro. Siento que en mi ejemplo alfa solo varía de gris a negro. Pensé de alguna manera aumentar el rango de alfa en todo el rango de blanco a negro. –

3

Aquí es una solución utilizando geom_ribbon() en lugar de geom_line() Respuesta

df.rain$group <- seq_along(df.rain$x) 
tmp <- tail(df.rain, -1) 
tmp$group <- tmp$group - 1 
tmp$dens0 <- head(df.rain$dens0, -1) 
dataset <- rbind(head(df.rain, -1), tmp) 
ggplot(dataset, aes(x = x, ymin = -dens0, ymax = dens0, group = group, 
    alpha = dens0)) + geom_ribbon() + scale_alpha(range = c(0, 1)) 

enter image description here

ggplot(dataset, aes(x = x, ymin = -dens0, ymax = dens0, group = group, 
    fill = dens0)) + geom_ribbon() + 
    scale_fill_gradient(low = "white", high = "black") 

enter image description here

Sede de Pablo para cambiar los colores.

dataset9 <- merge(dataset, data.frame(study = 1:9)) 
ggplot(dataset9, aes(x = x, ymin = -dens0, ymax = dens0, group = group, 
    alpha = dens0)) + geom_ribbon() + scale_alpha(range = c(0, 0.5)) + 
    facet_wrap(~study) 

enter image description here

+0

Mhm.Tan pronto como produzco varios gráficos, los contornos aparecen irregulares y los resultados generales aparecen en negro: 'n <- 10 conjunto de datos5 <- do.call (" rbind ", replicar (n, conjunto de datos, simplificar = FALSO)) conjunto de datos5 $ study <- rep (c (1:10), each = 998) ggplot (conjunto de datos5, aes (x = x, ymin = -dens0, ymax = dens0, grupo = grupo, alpha = dens0)) + geom_ribbon() + scale_alpha (rango = c (0, 1)) + facet_grid (study ~.) ' –

+0

¿Podría darnos un ejemplo de los contornos dentados? No los consigo con tu código. Si la imagen es en negro, juega un poco con el argumento de rango de scale_alpha. 0 = completamente transparente, 1 = completamente opaco. O puede agregar un argumento 'color =' gray '' o 'color =' red '' a geom_ribbon – Thierry

+0

Los contornos dentados se debieron al hecho de que imprimí el gráfico a un formato de píxel. Sin embargo, parece que uno puede evitar eso usando tanto 'geom_ribbon' como' geom_line'. –

Cuestiones relacionadas