ggplot legend for colour with auxiliary variable

I'd like to create a plot with a quadratic curve in black, and horizontal lines at various levels in different colours, with a legend (guide) that labels the horizontal line colours. I can't quite figure it out -- I've tried a couple of variations that seem to make sense to me, but I can't seem to force the legend to appear.

Here's my latest attempt:

library(ggplot2)
theme_set(theme_bw()) ## cosmetic
hdat <- data.frame(harvest_rate=c(5,15,25,30))
r <- 1; K <- 100
ggplot(hdat)+
    geom_hline(data=hdat,aes(yintercept=harvest_rate,
               colour=factor(harvest_rate)))+
    stat_function(fun=function(x) r*x*(1-x/K),colour="black")+
    expand_limits(x=c(0,110))

The lines come out OK, but the legend/guide is not there.

If I do this instead:

ggplot(hdat,aes(yintercept=harvest_rate,
               colour=factor(harvest_rate)))+
    geom_hline()+
    stat_function(fun=function(x) r*x*(1-x/K),colour="black")+
    expand_limits(x=c(0,110))

then to my surprise the horizontal lines don't get drawn at all!

I've also tried (I started this way) setting up a data frame with x and y variables,

 d <- data.frame(x=0:110)
 d <- transform(d,y=r*x*(1-x/K))
 ggplot(d,aes(x,y))+geom_line()+
      geom_hline(data=hdat,aes(yintercept=harvest_rate,
               colour=factor(harvest_rate)))+
      scale_colour_brewer(palette="Set1")

The guide doesn't show up that way either.

If I set colour=NA in the initial ggplot call the legend appears, but the curve disappears. If I set colour=factor(1) as follows

 ggplot(d,aes(x,y,colour=factor(1)))+geom_line()+
      geom_hline(data=hdat,aes(yintercept=harvest_rate,
               colour=factor(harvest_rate)))+
      scale_colour_brewer(palette="Set1")

I get a curve and a legend, but the curve is in a bogus colour. If I override by setting geom_line(colour="black") then the legend disappears again ...

I would be very grateful for (1) a hack that works and (2) an explanation of the logic that I'm missing!

Answers


The complete answer:

library(ggplot2)
theme_set(theme_bw()) ## cosmetic
hdat <- data.frame(harvest_rate=c(5,15,25,30))
r <- 1; K <- 100

ggplot(hdat)+
  geom_hline(aes(yintercept=harvest_rate, colour=factor(harvest_rate)), show_guide=TRUE)+
  stat_function(fun=function(x) r*x*(1-x/K),colour="black")+
  expand_limits(x=c(0,110)) +
  labs(colour = "Harvest rate") # making a pretty legend title

The result:


Need Your Help

Dismissing pickers and keyboards invoked by a UIWebView

iphone uiwebview

I am implementing an in-app browser using UIWebView, that shows an 'action' button up-top that - when tapped - scales the UIWebView and allows the user to perform some other actions.

Assigning php POST array to Javascript array

php javascript json

I know this may sound similar to some past Q/As, I think mine is slightly different though.. I have a webpage which I want to dynamically load text file information. I upload the text file through an