2012-09-27 12 views
7

Estoy tratando de hacer un diagrama con diagramas de caja horizontales en ggplot2, que solo se puede hacer usando coord_flip(). También estoy tratando de espaciar las gráficas de caja verticalmente para agrupar ciertos conjuntos. He leído que la facetación se recomienda para este tipo de cosas, pero esto es incompatible con coord_flip(), como podemos ver aquí: ggplot2: boxplot with facet_grid and free scale. Entonces me pregunto si es posible usar niveles en blanco para crear espacios en blanco. Esto es lo que he logrado hacer hasta ahora:posicionamiento de diagramas de caja horizontales en ggplot2

d <- diamonds 
library("ggplot2") 
levels(d$cut) <- list(A="Fair", B="Good", "-", C="Very Good", D="Ideal", E="Premium") 
p = ggplot(d, aes(x=cut, y=depth)) 
p + 
    geom_boxplot(color="black", size=0.2) + 
    theme_bw() + 
    scale_x_discrete(breaks = c("A", "B", "-", "C", "D", "E"), drop=FALSE) + 
    coord_flip() 

ph = 2.75 
pw = 4 
ggsave("plot.png", height=ph, width=pw) 

Como se puede ver, si creo un nivel de blanco con "-" en ella e incluirla en scale_x_discrete(), entonces de alguna manera me sale una fila en blanco . El problema es que solo puedo agregar un espacio. ¿Alguien tiene alguna idea sobre cómo agregar espacios entre estos gráficos de cajas horizontales?

Respuesta

3

He aquí una manera que le permitirá añadir más niveles en blanco:

d <- diamonds 
levels(d$cut) <- list(A="Fair", B="Good", " "="space1", C="Very Good", D="Ideal", " "="space2", E="Premium") 
ggplot(d, aes(x=cut, y=depth)) + 
    geom_boxplot(color="black", size=0.2) + 
    theme_bw() + 
    scale_x_discrete(breaks = c("A", "B", " ", "C", "D", " ", "E"), drop=FALSE) + 
    coord_flip() 

Esto dejará marcas de graduación en los separadores, así, sin embargo:

plot with tick marks

Extracción de todas las garrapatas es simple añadiendo:

+ theme(axis.ticks.y = element_line(linetype=0)) 

plot without tick marks

Pero si desea eliminar las marcas de graduación sólo para los espaciadores, al menos una forma (estoy seguro de que hay otros) es hacerlo con una función personalizada:

f <- function(x) { 
    x[!x %in% c("A", "B", "C", "D", "E")] <- NA 
    x 
} 

ggplot(d, aes(x=cut, y=depth)) + 
    geom_boxplot(color="black", size=0.2) + 
    theme_bw() + 
    scale_x_discrete(breaks=f, drop=FALSE) + 
    coord_flip() 

plot with some tick marks

Cuestiones relacionadas