2011-09-26 22 views
8

Me encuentro con este problema en ggplot2, tal vez alguien me puede ayudar.Reordenar la leyenda sin cambiar el orden de los puntos en la parcela

Tengo un diagrama donde el orden de las variables en la leyenda está en orden inverso a cómo se muestran en el diagrama.

Por ejemplo:

df=data.frame(
mean=runif(9,2,3), 
Cat1=rep(c("A","B","C"),3), 
Cat2=rep(c("X","Y","Z"),each=3)) 

dodge=position_dodge(width=1) 
ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+ 
geom_point(aes(shape=Cat2),size=4,position=dodge)+ 
scale_color_manual(values=c("red","blue","black"))+ 
scale_shape_manual(values=c(16:19))+ 
coord_flip() 

produce:

example

Así que los puntos se muestran en la trama como Cat2 = Z, Y, entonces X (diamantes negros, triángulo azul, rojo círculo) pero en la leyenda se muestran como Cat2 = X, Y, luego Z (círculo rojo, triángulo azul, diamante negro).

¿Cómo puedo invertir el orden de la leyenda sin cambiar los puntos en la trama? Reordenar el factor produce el problema opuesto (los puntos en la trama están invertidos).

Gracias!

+2

Por ahora, probablemente no haya una manera fácil. Sin embargo, la próxima versión puede tener una opción para invertir el orden de la leyenda. – kohske

+0

Hmm, eso apesta. Bueno saber. ¡Gracias por el aviso! – jslefche

+1

Establezca la escala 'breaks'. – hadley

Respuesta

0

Por lo que yo entiendo lo que quiere lograr, este simple manipulación que hace el truco para mí:

  1. definir un Cat2 como un factor (con los niveles en el orden adecuado) y
  2. chage el orden de los colores y las formas para que coincida con el orden niveles (en los comandos scale_manual)

Este es el código para hacerlo:

library(ggplot2) 

df=data.frame(
    mean=runif(9,2,3), 
    Cat1=rep(c("A","B","C"),3), 
    Cat2=factor(rep(c("X","Y","Z"),each=3), levels=c('Z', 'Y', 'X'))) 

dodge=position_dodge(width=1) 
ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+ 
    geom_point(aes(shape=Cat2),size=4,position=dodge)+ 
    scale_color_manual(values=c("black","blue","red"))+ 
    scale_shape_manual(values=c(18:16))+ 
    coord_flip() 
+0

Por desgracia, como enterré al final de mi pregunta, invertir el factor invierte la leyenda pero también invierte los puntos en la trama (el círculo rojo es ahora el primero). Quiero preservar el orden de los puntos en la trama, pero invertir la leyenda. Utilicé tu solución y simplemente copié la leyenda en la primera parcela. No es elegante, pero tendrá que hacer. Gracias por la visión de todos modos! – jslefche

3

de profundizar en el comentario de Hadley, haríamos algo así:

ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+ 
geom_point(aes(shape=Cat2),size=4,position=dodge)+ 
scale_color_manual(values=c("red","blue","black"),breaks = c('Z','Y','X'))+ 
scale_shape_manual(values=c(16:19),breaks = c('Z','Y','X'))+ 
coord_flip() 

enter image description here

Tenga en cuenta que teníamos que establecer las roturas en ambos escalas. Si hiciéramos solo uno, no coincidirían, y ggplot los dividiría en dos leyendas, en lugar de fusionarlos.

+0

Si tiene varias escalas manuales, p. 'scale_fill_manual',' scale_color_manual' y 'scale_shape_manual' y si desea cambiar las etiquetas, debe proporcionar las mismas etiquetas a todas ellas, lo que puede ser tedioso (supongamos que tiene 6 variables con 6 etiquetas explicativas largas). No hay otra manera, ¿verdad? – PatrickT

Cuestiones relacionadas