2009-11-24 5 views
6

estoy teniendo un pequeño problema con conseguir ggplot2 trabajar como yo quiero. Básicamente, me gustaría comparar las observaciones reales vs. aproximadas al ponerlas en una sola gráfica. Por ejemplo,problema con la leyenda, mientras que el trazado de datos de dos hoja.de.datos

> library(ggplot2) 
> df.actual <- data.frame(x = 1:100, y = (1:100) * 2) 
> df.approx <- data.frame(x = 1:150, y = (1:150) * 2 + 5 + rnorm(150, mean = 3)) 
> ggplot() + geom_point(aes(x, y), data = df.actual) + geom_line(aes(x,y), data = df.approx) 

Mi problema es que no puedo mostrar una leyenda. Leí en alguna parte que la leyenda de ggplot2 no es muy flexible (?). Idealmente, una leyenda con

  • title = 'Tipo'
  • clave: un punto negro lleno, y una línea de negro
  • etiqueta de tecla: 'real', 'aproximado'
  • legend.position = 'topright'

Gracias.

Respuesta

6

Pruebe lo siguiente para que pueda empezar

ggplot() + 
    geom_point(aes(x, y, colour = "actual"), data = df.actual) + 
    geom_line(aes(x, y, colour = "approximate"), data = df.approx) + 
    scale_colour_discrete("Type") 
+1

Gracias Hadley, Me gustaría distinguir la fecha en blanco y negro. ¿Es posible tener una leyenda como describí cuyas dos claves son un punto y una línea? – knguyen

4

Esta es una especie de truco para modificar la leyenda por la manipulación del objeto de la cuadrícula:

library("ggplot2") 
df.actual <- data.frame(x=1:100, y=(1:100)*2) 
df.approx <- data.frame(x=1:150, y=(1:150)*2 + 5 + rnorm(150, mean=3)) 
p <- ggplot() + 
    geom_point(aes(x, y, colour="Actual"), data=df.actual) + 
    geom_line(aes(x, y, colour="Approximate"), data=df.approx) + 
    scale_colour_manual(name="Type", 
         values=c("Actual"="black", "Approximate"="black")) 
library("grid") 
grob <- ggplotGrob(p) 
tmp <- grid.ls(getGrob(grob, "key.segments", grep=TRUE, global=TRUE))$name 
grob <- removeGrob(grob, tmp[1]) # remove first line segment in legend key 
tmp <- grid.ls(getGrob(grob, "key.points", grep=TRUE, global=TRUE))$name 
grob <- removeGrob(grob, tmp[2]) # remove second point in legend key 
grid.draw(grob) 

ggplot2 output http://img134.imageshack.us/img134/8427/ggplotlegend.png

+0

Gracias por el ejemplo reproducible. ggplot2 debería manejar este tipo de leyenda automáticamente, así que lo agregaré a mi lista de tareas pendientes. – hadley

Cuestiones relacionadas