2011-03-30 25 views
32

Hola he trazado una parcela faceta utilizando ggplot en I y aquí está la tramaCómo cambiar el orden de las etiquetas de las facetas en ggplot (personalizadas etiquetas envolventes faceta)

http://i.stack.imgur.com/5qXF1.png

El problema que tengo es, El las facetas (etiquetas) se ordenan alfabéticamente (Ej: E1, E10, E11, E13, E2, E3, I1, I10, I2) pero necesito que sean un pedido personalizado como E1, I1, E2, I2, E3, E10, I10, E11, E13.

¿Cómo puedo hacer eso?

+5

Reordenar el orden del factor subyacente. Puede usar 'relevel()' o 'reorder()' o hacer un pedido personalizado y usar 'factor()'. – Chase

Respuesta

40

No confíe en el orden predeterminado de los niveles impuestos por factor() o internamente por ggplot si la variable de agrupación que usted suministra es no un factor. Establezca los niveles explícitamente usted mismo.

dat <- data.frame(x = runif(100), y = runif(100), 
        Group = gl(5, 20, labels = LETTERS[1:5])) 
head(dat) 
with(dat, levels(Group)) 

¿Qué sucede si los quiero en este orden arbitrario?

set.seed(1) 
with(dat, sample(levels(Group))) 

Para hacer esto, configure los niveles como desee.

set.seed(1) # reset the seed so I get the random order form above 
dat <- within(dat, Group <- factor(Group, levels = sample(levels(Group)))) 
with(dat, levels(Group)) 

Ahora podemos usar esto para tener los paneles dibujados en el orden que falta:

require(ggplot2) 
p <- ggplot(dat, aes(x = x)) + geom_bar() 
p + facet_wrap(~ Group) 

que produce:

facets wrapped

+1

Muchas gracias, gavin :) – Jana

0

simple hecho de estar trabajando en un similares problema. Tengo los niveles que se parecen a esto por defecto:

[1] "A1" "A10" "A2" "A3" "A4" "A5" "A6" "A7" "A8" "A9" 
[11] "B1" "B2" "B3" "B4" "B5" "B6" "B7" "B8" "B9" 

Tenga en cuenta que el segundo nivel está fuera de lugar debido al orden alfabético.

Esto es lo que estoy haciendo para fijar el orden:

reorder(factor(fct), 
     fct %>% 
      str_replace("([[:alpha:]]+)", "\\1|") %>% 
      str_split("\\|") %>% 
      sapply(function(d) sprintf("%s%02d", d[1], as.integer(d[2]))), 
     function(x) x[1]) 

Sustituye a niveles como "A1" con "A01" y luego reordena de acuerdo con éstas. Estoy seguro de que podrías hacer esto mucho más eficientemente, pero hace el trabajo.

Se podría adaptar para solucionar el problema original.

Cuestiones relacionadas