Gilles San Martin
Gilles San Martin

Reputation: 4380

ggplot2 legend with two different geom_point

I have the following ggplot graph with circles representing the observed data and the crosses the mean for each treatment :

d <- data.frame(Number = rnorm(12,100,20), 
                Treatment = rep(c("A","B","C", "D"), each = 3))
av <- aggregate(d["Number"], d["Treatment"], mean)

ggplot(data = d, aes(y = Number, x = Treatment)) + 
    geom_point(shape = 1, size = 6,  color = "grey50") +
    geom_point(data=av, shape = 4) +
    theme_bw()

I would like to add a legend with the exact same symbols on top of the graphs but I'm a bit lost... I use aes to force the creation of legend and then try to modify it with manual scales but the result is not convincing. I would like to have one grey circle of size 6. That sounds also quite complicated for such a basic thing ... There is probably an easyier solution.

ggplot(data = d, aes(y = Number, x = Treatment)) + 
    geom_point(aes(shape = "1", size = "6",  color = "grey50")) +
    geom_point(data=av, aes(shape = "4")) +
    theme_bw() +
    scale_shape_manual(name = "", values = c(1,4), labels = c("observed values", "mean")) +
    scale_size_manual(name = "", values = c(6,1), labels = c("observed values", "mean")) +
    scale_color_manual(name = "", values = c("grey50","black"), 
                       labels = c("observed values", "mean")) +
    theme(legend.position = "top",
          legend.key = element_rect(color = NA))

http://imagizer.imageshack.us/v2/320x240q90/842/4pgj.png

Upvotes: 2

Views: 3462

Answers (1)

Roland
Roland

Reputation: 132989

The ggplot2 way would be combining everything into a single data.frame like this:

av$Aggregated <- "mean"
d$Aggregated <- "observed value"
d <- rbind(d, av)

ggplot(data = d, aes(y = Number, x = Treatment, 
                     shape=Aggregated, size=Aggregated, colour=Aggregated)) + 
   geom_point() 

And than customize using manual scales and themes.

Upvotes: 3

Related Questions