2012-04-18 16 views
10

Actualmente estoy trabajando en un proyecto que implica la creación de parcelas muy similares a los ejemplos en la página de Hadley ggplot2 0.9.0 con respecto a stat_density2d().ggplot2: Establecer alfa = 0 para ciertos puntos dependiendo del valor de relleno

library(ggplot2) 
dsmall <- diamonds[sample(nrow(diamonds), 1000), ] 
d <- ggplot(dsmall, aes(carat, price)) + xlim(1,3) 
d + stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) 
last_plot() + scale_fill_gradient(limits=c(1e-5,8e-4)) 

enter image description here

Ahora, lo que yo estoy luchando con es una manera de convertir esencialmente fuera alfa (alfa = 0) para todos los azulejos no están en el rango de relleno. Por lo tanto, cada mosaico gris que se ve en la imagen, el alfa debe establecerse en 0. Esto haría que la imagen sea mucho más agradable, especialmente cuando se superpone en la parte superior de un mapa, por ejemplo.

Si alguien tiene alguna sugerencia, esta sería muy apreciada.

+3

La zona gris se controla por el argumento na.value a scale_fill_gradient, pero incluso cuando especifica un color transparente (como na.value = RGB (1,1,1,0)) sale opaco, por lo que debe haber algo más sucediendo. – Fojtasek

+0

Muy bien, entonces quizás, si podemos establecer los límites de un scale_alpha_continuous para que dependan del valor de relleno (densidad), entonces configure el alpha na.value = 0 ... –

+0

sin suerte hasta el momento, aunque el ajuste a 'gray90' hace se ve * casi * OK, ya que ese es el color de la cuadrícula de fondo ... De hecho, sospecho que se trata de un "problema" de ggplot (buglet/wishlist?) ... posiblemente relacionado con https://github.com/hadley/ggplot2/issues/475? –

Respuesta

9

Esto parece funcionar:

d + stat_density2d(geom="tile", 
    aes(fill = ..density.., 
    alpha=cut(..density..,breaks=c(0,1e-5,Inf))), 
    contour = FALSE)+ 
scale_alpha_manual(values=c(0,1),guide="none") 

enter image description here

+0

¡Perfecto! Gracias por tu ayuda, Ben. –

+0

Esto es increíble, me ayudó mucho. Le daría 3 upvotes si pudiera. – cengel

11

Otra posibilidad, simplemente usando ifelse en lugar de cut.

d + stat_density2d(geom="tile", 
    aes(fill = ..density.., alpha = ifelse(..density.. < 1e-5, 0, 1)), 
    contour = FALSE) + 
scale_alpha_continuous(range = c(0, 1), guide = "none") 

enter image description here

+0

Esto también funciona genial. ¿Podría explicar por qué no es suficiente establecer 'alfa' en las opciones' aes (..) 'solamente, pero ¿por qué la transparencia del área de relleno solo se puede controlar configurando el rango con' scale_alpha_continuous'? Por ejemplo, utilicé 'alpha = ifelse (.. density .. <1e-5, 0, 0.7)' y 'scale_alpha_continuous (range = c (0, 0.7))' para hacer que el área de relleno sea ligeramente transparente. – cengel

Cuestiones relacionadas