Well time to confess ... The problem is with the learner (me) not the teacher (Hadley). There is no bug. I did not reproduce what Hadley wrote, but sorting it out got me a step closer to the top of the mountain. I had two mistakes in the code I posted: 1) color must be inside the aes() function as Dicko kindly pointed out; and 2) the color argument in geom_line() must refer to the label of the color ('below' or 'above') and not the color itself.
I'm on my second time through the book, and it scary how much I didn't get the first time, but yes Dennis, I can hardly wait to get back to Chapter 9. <G> There will likely be a third read after more every day use. # The correct code (& as Hadley actually has it) for those who might care: library(ggplot2) data(LakeHuron) huron = data.frame(year=1875:1972,level=LakeHuron) p = ggplot(huron, aes(year)) + geom_line(aes(y= level - 5, colour = 'below')) + geom_line(aes(y= level + 5, colour = 'above')) + scale_colour_manual("Direction", c("below" = "blue", "above" = "red")) print(p) I get the same result as you did. Perhaps the problem is the failure to define breaks in the scale code. The issue, of course, is to figure out what should be the breaks... One approach is to go back into the data, add variables below and above, melt the data frame to stack below and above into one variable, and plot. Why would one want to do that? In order to create a factor variable with levels lower and upper to pass as an aesthetic in the ggplot() call. The function melt() from the reshape package is useful for this task. A useful trick is to define the variable and level names to match the legend titles you want. For some reason, melt doesn't like Time-Series objects in a data frame, so I converted level to numeric. # library(ggplot2) huron2 <- huron huron2$level <- as.numeric(huron2$level) # Add levels below and above huron2 <- transform(huron2, below = level - 5, above = level + 5) # Melt the data to stack below and above. The names go into # a factor variable named Direction; # the values are in a new variable called (oddly enough) value # variable_name is an argument in very recent versions of reshape(2) huron3 <- melt(huron2, measure = c('below', 'above'), variable_name = 'Direction') head(huron3) # Direction is a factor variable, so it makes a nice choice for an aesthetic: ggplot(huron3, aes(x = year, y = value, colour = Direction)) + ylab('Water level') + geom_line() + scale_colour_manual(breaks = levels(huron3$Direction), values = c('blue', 'red')) With the levels of Direction defined, the breaks are easy to identify, and we can use values = to specify the desired colors. If you're just learning ggplot2, try to minimize the amount of work you have to do to specify a scale (personal experience :) ggplot2 is easiest when you do the hard work in arranging the data so that the call to ggplot() Is straightforward. In other words, it's not just about ggplot2, it's also about plyr and reshape(2). Keep reading; you'll get there (Chapter 9 :) I prefer to think of this problem as an evolution of the package. I'll let Hadley be the judge of whether or not the B word applies. HTH, Dennis On Sun, Jan 30, 2011 at 9:54 AM, Robert Baer <rb...@atsu.edu> wrote: According to Hadley's ggplot book (p. 109), both the graphs below should have a legend, and yet none appears in my hands. Any suggestions? I can't see a typo. Is there a bug? library(ggplot2) data(LakeHuron) huron = data.frame(year=1875:1972,level=LakeHuron) p = ggplot(huron, aes(year)) + geom_line(aes(y= level - 5), colour = 'blue') + geom_line(aes(y= level + 5), colour = 'red') print(p) key = c('below' = "blue", 'above' = "red") p = p + scale_color_manual("Direction", values = key) print(p) > sessionInfo() R version 2.12.1 (2010-12-16) Platform: i386-pc-mingw32/i386 (32-bit) locale: [1] LC_COLLATE=English_United States.1252 [2] LC_CTYPE=English_United States.1252 [3] LC_MONETARY=English_United States.1252 [4] LC_NUMERIC=C [5] LC_TIME=English_United States.1252 attached base packages: [1] grid stats graphics grDevices utils datasets methods [8] base other attached packages: [1] ggplot2_0.8.9 proto_0.3-8 reshape_0.8.4 plyr_1.4 loaded via a namespace (and not attached): [1] tools_2.12.1 > # on Windows XP > version _ platform i386-pc-mingw32 arch i386 os mingw32 system i386, mingw32 status major 2 minor 12.1 year 2010 month 12 day 16 svn rev 53855 language R version.string R version 2.12.1 (2010-12-16) > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.