2012-07-06 8 views
5

Considérese la siguiente trama de datos:leyenda colores uniformes con qplot

x = read.table(text = 'Lo Re Pe 
1 T 33 
1 F 22 
1 H 11 
2 T 22 
2 F 22', header = TRUE) 

y la figura siguiente:

qplot(factor(Lo), data=x, geom='bar', fill=Re, weight=Pe, 
     xlab='L', main='Title', ylab='Pe') 

ahora esto trama de datos:

x <- read.table(text = 'Lo Re Pe 
1 D 33 
1 K 22 
2 D 22 
2 K 22', header=TRUE) 

con el mismo qplot declaración.

Los colores asignados a cada valor de Re no son consistentes entre los trazados, por lo que es difícil comparar los trazados directamente.

¿Cómo se especifica que Re valor T debe ser siempre "Rojo", por ejemplo, y que Re valor F siempre debería ser "azul", por ejemplo, para que el comando qplot siempre utiliza consistentes colores para cada Re valor, independientemente del contenido del marco de datos? Hay un número finito y conocido de valores para Re, por lo que podría especificarlos todos.

Probé el siguiente cuando la trama de datos contenida valores T, F y H:

qplot(factor(Lo), data=x, geom='bar', fill=Re, weight=Pe, 
     xlab='Loci', main='Title', ylab='Pe', 
     scale_fill_manual(values=c("Blue","Red","Green"),labels=c("T","F","H"))) 

pero R informa de un error acerca de longitud incorrecta y no produce una trama.

La solución idealmente me permitiría especificar colores para todos los valores posibles de Re, aunque todos estos pueden no estar presentes en el marco de datos.

+0

tal vez quiere que nos proporcione un ejemplo reproducible? http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

@ RomanLuštrik: Listo. Pregunta reelaborada por completo. – SabreWolfy

+2

Creo que esto funcionará bien si solo te aseguras de usar factores con los mismos niveles y 'scale_colour_discrete (drop = FALSE)' –

Respuesta

6

Esto es perfectamente posible usando la naturaleza modular de ggplot. Sin embargo, le recomendaré que deje qplot y cambie a usar ggplot(). No le costará nada y será más conveniente a largo plazo, ya que es más adecuado para hacer cosas "complicadas".

Vamos a empezar con los dos conjuntos de datos:

x1 = read.table(text = 'Lo Re Pe 
1 T 33 
1 F 22 
1 H 11 
2 T 22 
2 F 22', header = TRUE) 

x2 <- read.table(text = 'Lo Re Pe 
1 D 33 
1 K 22 
2 D 22 
2 K 22', header=TRUE) 

Ahora aquí está su primera trama, pero traducido a ggplot():

p <- ggplot(x1,aes(x = factor(Lo))) + 
     geom_bar(aes(fill = Re,weight = Pe)) + 
     labs(x = 'L',y = 'Pe') + 
     opts(title = 'Title') 

para mantener el color consistente a través de parcelas, y para evitar que los colores no utilizados de aparecer en la leyenda, simplemente crearemos una clave de color maestra, y solo transferiremos el subconjunto necesario a nuestra escala:

(También podría hacer algo similar usando la función levels, pero quería evitar incluyendo niveles que no aparecen en el conjunto de datos.)

Obviamente, se puede elegir cualquier color que te gusta.Ahora puede personalizar la escala fill de nuestra parcela p pasando de ese segmento de color_key que es relevante para scale_fill_manual:

p + scale_fill_manual(values = color_key[names(color_key) %in% x1$Re]) 

enter image description here

Además, si sus parcelas toda realmente tienen la misma estructura, nos ni siquiera necesita replicar la llamada ggplot una y otra vez. Simplemente podemos aplicar nuestra parcela p a un nuevo conjunto de datos:

p1 <- p %+% x2 

Y a continuación, añadir la escala fill de la misma manera:

p1 + scale_fill_manual(values = color_key[names(color_key) %in% x2$Re]) 

enter image description here

Por último, vamos a mezclar y combinar a nosotros mismos un nuevo conjunto de datos:

x3 <- rbind(x1[1:2,],x2[3:4,]) 

El mismo proceso funciona de nuevo:

p3 <- p %+% x3 
p3 + scale_fill_manual(values = color_key[names(color_key) %in% x3$Re]) 

enter image description here

+0

Gracias por la respuesta detallada. Estoy trabajando en eso ahora. La línea que comienza con 'p + scale_fill_manual' da error' Error: Valores insuficientes en la escala manual. Se necesitan 3, pero solo se proporcionan 0 y no hay diagrama. – SabreWolfy

+0

@SabreWolfy Es posible que no hayas ejecutado el código en mi publicación _exactamente_ como aparece, porque todo funciona bien para mí. Ejecuta cada pieza en secuencia (incluida la generación de 'x1' y' x2') y comprueba que cada una se haya ejecutado correctamente. – joran

+0

Sí, lo he hecho :) Copié y pegué cada sección en orden. El comando 'unique' solo devuelve 3 valores. Estoy tratando de descubrir por qué ahora. – SabreWolfy

Cuestiones relacionadas