2011-08-02 7 views
15

En la capa geom_tile() en el paquete de visualización de datos ggplot2 para R, cuando una celda no contiene datos, no se dibuja. P.ej. http://docs.ggplot2.org/current/geom_tile.html y busque "valor faltante".ggplot2 hace que el valor faltante en geom_tile no esté en blanco

Me gustaría cambiar este comportamiento para mostrar el valor mínimo de todos los bloques. ¿Es posible? y si lo es, ¿cómo?

contexto adicional: cuando uso

stat_density2d(aes(x=x,y=y, fill=..density..), geom="tile", contour=FALSE) 

Me gustaría que las regiones con densidad sin que mirar muy similar a las regiones con muy poca densidad. Tal como está ahora, si el espectro de color es de azul a rojo y el fondo es blanco, entonces cuando no hay datos en un mosaico es blanco y cuando hay un solo punto de datos en un mosaico es azul.

Agregar un pseudo recuento a los datos parece posible, pero ¿cómo sé de antemano cómo distribuir los pseudo-conteos? y en el caso cuando hay facetas?

+0

No estoy del todo seguro de lo que estás buscando (un ejemplo reproducible ayudaría mucho), pero tal vez podría intentar '+ scale_fill_gradient (limits = c (0, ...)) 'y reemplaza' ... 'con un valor máximo adecuado? – joran

Respuesta

6

Este problema también se puede solucionar mediante una opción en scale_fill_continuous

scale_fill_continuous(na.value = 'salmon') 
23

Si sus datos son de tipo cuadrícula, ¿qué le parece agregar geom_tile() para NA por subset()?

# Generate data 
pp <- function (n, r = 4) { 
    x <- seq(-r*pi, r*pi, len = n) 
    df <- expand.grid(x = x, y = x) 
    df$r <- sqrt(df$x^2 + df$y^2) 
    df$z <- cos(df$r^2)*exp(-df$r/6) 
    df 
} 
pp20 <- pp(20)[sample(20*20, size = 200),] 

df_grid <- expand.grid(x = unique(pp20$x), y = unique(pp20$x)) 
df_merge <- merge(pp20, df_grid, by = c("x", "y"), all = TRUE) 

# Missing values 
ggplot(df_merge, aes(x = x, y = y)) + 
    geom_tile(data = subset(df_merge, !is.na(z)), aes(fill = z)) + 
    geom_tile(data = subset(df_merge, is.na(z)), aes(colour = NA), 
    linetype = 0, fill = "pink", alpha = 0.5) 

an example

+0

Esto parece un enfoque razonable. ¡Gracias! – momeara

+2

probé el código, pero la leyenda de NA no apareció ... el autor de ggplot2 mencionó esto también en esta publicación: https://groups.google.com/forum/#!topic/ggplot2/MbYp5K03X3w así que cómo ¿conseguiste esa leyenda de NA? – olala

4

esta pregunta tal vez puede ser un poco demasiado 'linda', pero podría ser una solución para cambiar simplemente el color de fondo de la trama para ser el color mínimo en su escala? Por ejemplo:

+ opts(plot.background = theme_rect(colour = "blue") 

Si su parcela tiene una estructura más compleja y esto termina haciendo el azul de fondo en las zonas donde no desea que esto suceda, se podría trazar una capa geom_rect primera que se extiende a través de la rangos de sus datos solamente.

+0

Estas son ideas ingeniosas y buenos trucos para recordar. ¡Gracias! – momeara

4

Para la posteridad, aquí es la solución adecuada compatible con ggplot2 versión 1.9.3

+ theme(panel.background=element_rect(fill="blue", colour="blue") 
  • En la respuesta de Joran, la plot.background es toda la trama incluyendo el título y la leyenda etc. El panel.background es el área donde aparecen los datos.

  • En la última versión del ggplot2, opts se ha sustituido por theme y theme_rect se ha sustituido por element_rect.

  • Al especificar element_rect, color es el límite del rectángulo, mientras que fill es el interior del rectángulo.

que había utilizado originalmente,

+ geom_rect(aes(xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf), fill="blue") 

pero al añadir geom_raster en lugar de geom_tile sobre el fondo y generar pdf de salida, visualizadores de PDF tenían un tiempo muy difícil hacer que la trama, utilizando sustancialmente más CPU ciclos y memoria.

Cuestiones relacionadas