tags:

views:

746

answers:

2

Hi,

I'm having a little trouble with getting ggplot2 to work as I want. Basically, I'd like to compare actual observations vs. approximated by putting them in one single plot. For example,

> 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)

My problem is that I can't display a legend. I read somewhere that ggplot2's legend is not very flexible(?). Ideally, a legend with

  • title = 'Type'
  • key: a black filled point, and a black line
  • key label: 'Actual', 'Approximate'
  • legend.position = 'topright'

Thanks.

+1  A: 

Try this to get you started

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")
hadley
Thanks hadley,I'd like to distinguish the date black and white plot. Is it possible to have a legend as I described whose two keys are a point and a line?
knguyen
+3  A: 

This is some kind of hack to modify the legend by manipulation of the grid object:

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

rcs
Thanks for the reproducible example. ggplot2 should handle this type of legend automatically, so I'll add this to my to do list.
hadley