2011-08-09 9 views
7

Estoy usando el geom_tile de ggplot para hacer diagramas de densidad bidimensional facetados por un factor. La escala de cada faceta va desde el mínimo de todos los datos hasta el máximo de todos los datos, pero el geom_tile en cada faceta solo se extiende al rango de los datos trazados en esa faceta.¿Cómo puedo forzar que geom_tile de ggplot llene cada faceta?

código de ejemplo que muestra el problema:

library(ggplot2) 

data.unlimited <- data.frame(x=rnorm(500), y=rnorm(500)) 
data.limited <- subset(data.frame(x=rnorm(500), y=rnorm(500)), x<1 & y<1 & x>-1 & y>-1) 

mydata <- rbind(data.frame(groupvar="unlimited", data.unlimited), 
       data.frame(groupvar="limited", data.limited)) 

ggplot(mydata) + 
    aes(x=x,y=y) + 
    stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) + 
    facet_wrap(~ groupvar) 

facet

ejecuta el código, y verá dos facetas. Una faceta muestra un diagrama de densidad de una distribución normal aleatoria "ilimitada". La segunda faceta muestra una normal aleatoria truncada para que se encuentre dentro de un cuadrado de 2x2 sobre el origen. El geom_tile en la faceta "limitada" estará confinado dentro de esta pequeña caja en lugar de llenar la faceta.

last_plot() + 
    scale_x_continuous(limits=c(-5,5)) + 
    scale_y_continuous(limits=c(-5,5)) 

specified limits

Estas tres últimas líneas de la trama con los mismos datos de x especificado y límites y, y vemos que ni la faceta amplía las secciones de baldosas a la ventaja en este caso.

¿Hay alguna manera de forzar que el geom_tile en cada faceta se extienda al rango completo de la faceta?

Respuesta

14

Creo que estás en busca de una combinación de scales = "free" y expand = c(0,0):

ggplot(mydata) + 
    aes(x=x,y=y) + 
    stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) + 
    facet_wrap(~ groupvar,scales = "free") + 
    scale_x_continuous(expand = c(0,0)) + 
    scale_y_continuous(expand = c(0,0)) 

enter image description here

EDITAR

Dada la aclaración de la OP, aquí es una opción a través de simplemente configurando el panel fondo manualmente:

ggplot(mydata) + 
    aes(x=x,y=y) + 
    stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) + 
    facet_wrap(~ groupvar) + 
    scale_fill_gradient(low = "blue", high = "red") + 
    opts(panel.background = theme_rect(fill = "blue"),panel.grid.major = theme_blank(), 
     panel.grid.minor = theme_blank()) 

enter image description here

+0

No, quiero que todas las facetas tengan la misma escala. Básicamente, solo quiero azul sólido fuera de la caja de 2x2 en el lado limitado, para indicar que hay densidad cero allí. En otras palabras, no quiero que las escalas se reduzcan al rango de los datos, solo quiero cubrir toda el área con geom_tile sin cambiar la escala. –

+0

En ese caso, es mejor que configure el fondo del panel manualmente. Voy a actualizar con un ejemplo ... – joran

+0

@Ryan - También puede mirar [aquí] (http://stackoverflow.com/questions/6906661/ggplot2-make-missing-value-in-geom-tile-not- en blanco) para otra opción, aunque creo que supone que tiene los valores de densidad disponibles. – joran

Cuestiones relacionadas