2012-02-21 8 views
6

Utilizando pch Puedo trazar cualquier símbolo y asignarle cualquier etiqueta en la leyenda. Pero, ¿cómo puedo trazar dos símbolos para cada etiqueta de leyenda? Por ejemplo, en el siguiente diagrama, me gustaría tener ■ ▲ ● emparejado con versiones rojas de esos, así que tengo solo tres etiquetas 'a', 'b', 'c' en la leyenda, para esos seis símbolos. Por el momento, parece que la leyenda básica parcela permite mí sólo para trazar un símbolo para cada etiqueta:Mostrar dos símbolos para cada etiqueta de leyenda

plot(rnorm(50),pch=c(15:17),col=1:2) 
legend('topleft',pch=c(15:17),col=1:2,legend=c("a","b","c"),cex=1.5) 

enter image description here

+0

Lo que impide la construcción de una leyenda a sí mismo con una combinación de 'puntos()' 'y de texto()'? (¿o sería una solución "aceptable"?) Otra idea sería usar 'ggplot2' con una escala' discrete' y 'color'. – chl

+1

@chl: Su primer punto: pensé que sería posible una solución más robusta/automática. Su segundo punto: sinceramente no me gusta ggplot2, porque agrega mucho chartjunk por defecto, así que lo evito. ¿Tal vez tienes una idea similar para celosía/cuadrícula? –

+0

Hmm. Me pregunto si los temas ggplot2 pueden modificarse para hacerte más feliz. ¿Qué consideras chartjunky además de los fondos y las líneas de la cuadrícula? Aunque creo que la solución de celosía proporcionada por @Josh O'Brien a continuación le conviene muy bien. –

Respuesta

8

Esto no es demasiado duro con lattice, como su argumento key = toma un número arbitrario de columnas para ser incluidas en la leyenda.

library(lattice) 

myPCH <- 15:17 
Data <- rnorm(50) 
Index <- seq(length(Data)) 

xyplot(Data ~ Index, 
     pch = myPCH, col=1:2, 
     key = list(space = "right", adj=1, 
        text = list(c("a", "b", "c"), cex=1.5), 
        points = list(pch = myPCH), 
        points = list(pch = myPCH,col=2))) 

no sé de la parte superior de mi cabeza la forma de incluir la leyenda dentro del área de trazado, pero con este tipo de trama parece mejor tenerlo fuera de todos modos. (Editar: @chl en los comentarios amablemente señala un par de maneras de hacer esto Para trazar la llave en la parte inferior izquierda de la figura, por ejemplo, sustituir space = "right" en lo anterior, ya sea con o corner = c(0,0)x = 0, y=0.2.)

enter image description here

+0

Sí, gracias @Josh (otra vez)!Necesito explorar celosía más. También resolvió mi otro problema que está cambiando el tamaño de los símbolos de leyenda sin cambiar el tamaño de la fuente :-) –

+0

Sweet. Al igual que usted, por la razón que sea, también prefiero la apariencia más limpia de los valores predeterminados gráficos de la red (aunque estoy seguro de que podrían modificarse con la suficiente facilidad). A favor de ggplot, tiene una sintaxis más intuitiva, una gran base de fans (y por lo tanto de soporte) aquí en SO, y parece estar bajo un desarrollo mucho más activo. Estoy empezando a pensar que puedo terminar dando ese paso uno de estos días ... –

+0

(+1) Buena respuesta. (Por cierto, puede alterar la ubicación de la leyenda usando 'corner' o' x =, y = '; por ejemplo,' key = list (x = .1, y = .9, adj = 1, ... 'pondrá la leyenda dentro de la región de trazado.) – chl

5

Al igual que chl señaló, también es posible crear una leyenda personalizada. La función 'leyenda' invisiblemente devuelve los límites del cuadro de leyenda así como también las coordenadas del texto de la leyenda. Uno podría trazar el texto de la leyenda sin símbolos, y luego agregar los símbolos manualmente con 'puntos' a las coordenadas devueltas. Esto no requeriría ningún paquete de gráficos adicionales:

plot(rnorm(50), pch=c(15:17), col=1:2) 
# Plot legend text, inset could be used to shift legend text to the right 
pos <- legend('topleft', legend=c("a","b","c"), cex=1.5) 
# Plot symbols in two columns, shifted to the left by 3 and 1 respectively 
points(x=rep(pos$text$x, times=2) - c(3,1), 
    y=rep(pos$text$y, times=2), 
    pch=rep(c(15:17), times=2), col=rep(1:2, times=3)) 

The image produced by the code

Cuestiones relacionadas