2010-11-25 21 views
24

algunos datos de ejemplo:¿Cómo se establecen diferentes límites de escala para diferentes facetas?

dfr <- data.frame(
    x = rep.int(1:10, 2), 
    y = runif(20), 
    g = factor(rep(letters[1:2], each = 10)) 
) 

Un simple diagrama de dispersión con dos facetas:

p <- ggplot(dfr, aes(x, y)) + 
    geom_point() + 
    facet_wrap(~ g, scales = "free_y") 

I puede establecer los límites del eje para todos los paneles con

p + scale_y_continuous(limits = c(0.2, 0.8)) 

(o una envoltura para este como ylim)

pero cómo puedo establecer di ¿Límites de ejes diferentes para diferentes facetas?

La forma latticey de hacerlo sería la de pasar una lista con este argumento, por ejemplo,

p + scale_y_continuous(limits = list(c(0.2, 0.8), c(0, 0.5))) 

desgracia que solo emite un error en el caso ggplot2.

EDIT:

Aquí un corte parcial. Si desea ampliar el rango de las escalas, puede agregar columnas a su conjunto de datos especificando los límites, y luego dibujarlas con geom_blank.

conjunto de datos Modificado:

dfr <- data.frame(
    x = rep.int(1:10, 2), 
    y = runif(20), 
    g = factor(rep(letters[1:2], each = 10)), 
    ymin = rep(c(-0.6, 0.3), each = 10), 
    ymax = rep(c(1.8, 0.5), each = 10) 
) 

parcela Actualizado:

p + geom_blank(aes(y = ymin)) + geom_blank(aes(y = ymax)) 

Ahora las escalas son diferentes y la mano izquierda es la correcta. Desafortunadamente, la escala de la mano derecha no se contrae, ya que necesita dejar espacio para los puntos.

En caso de que ayude, ahora podemos reformular la pregunta como "¿es posible dibujar puntos sin que se recalculen las escalas y sin llamar explícitamente al scale_y_continuous?"

Respuesta

5

No creo que esto sea posible todavía en ggplot2. Este discussion de enero sugiere que el problema está bajo consideración.

+0

Gracias por el enlace. No es exactamente la respuesta que esperaba. –

+0

@Ritchie: consulte con Hadley, podría tener algo en desarrollo en las versiones de desarrollo de ggplot2 –

0

Para contraer la escala en el diagrama de la izquierda, quite los puntos que se encuentran fuera del rango. P.ej. esto reducirá la escala y de la trama derecho a valores entre 0 y 0,5:

p <- ggplot(dfr, aes(x, y)) + 
    geom_point(subset=.(g == "a" | (y > 0 & y <.5))) + 
    geom_blank(aes(y = ymin)) + geom_blank(aes(y = ymax)) + 
    facet_wrap(~ g, scales = "free_y") 

Véase también mi respuesta a esta question.

Cuestiones relacionadas