Carl
Carl

Reputation: 7554

ggplot: legend for a plot the combines bars / lines?

I have a empirical PDF + CDF combo I'd like to plot on the same panel. distro.df has columns pdf, cdf, and day. I'd like the pdf values to be plotted as bars, and the cdf as lines. This does the trick for making the plot:

p <- ggplot(distro.df, aes(x=day))
p <- p + geom_bar(aes(y=pdf/max(pdf)), stat="identity", width=0.95, fill=fillCol)
p <- p + geom_line(aes(y=cdf))
p <- p + xlab("Day") + ylab("")
p <- p + theme_bw() + theme_update(panel.background = element_blank(), panel.border=element_blank())

However, I'm having trouble getting a legend to appear. I'd like a line for the cdf and a filled block for the pdf. I've tried various contortions with guides, but can't seem to get anything to appear.

Suggestions?

EDIT:

Per @Henrik's request: to make a suitable distro.df object:

df <- data.frame(day=0:10)
df$pdf <- runif(length(df$day))
df$pdf <- df$pdf / sum(df$pdf)
df$cdf <- cumsum(df$pdf)

Then the above to make the plot, then invoke p to see the plot.

Upvotes: 0

Views: 1780

Answers (2)

Carl
Carl

Reputation: 7554

I'd still like a solution to the above (and will checkout @aosmith's answer), but I am currently going with a slightly different approach to eliminate the need to solve the problem:

  p <- ggplot(distro.df, aes(x=days, color=pdf, fill=pdf))
  p <- p + geom_bar(aes(y=pdf/max(pdf)), stat="identity", width=0.95)
  p <- p + geom_line(aes(y=cdf), color="black")
  p <- p + xlab("Day") + ylab("CDF")
  p <- p + theme_bw() + theme_update(panel.background = element_blank(), panel.border=element_blank())
  p

This also has the advantage of displaying some of the previously missing information, namely the PDF values.

Upvotes: 0

aosmith
aosmith

Reputation: 36084

This generally involves moving fill into aes and using it in both the geom_bar and geom_line layers. In this case, you also need to add show_guide = TRUE to geom_line.

Once you have that, you just need to set the fill colors in scale_fill_manual so CDF doesn't have a fill color and use override.aes to do the same thing for the lines. I didn't know what your fill color was, so I just used red.

ggplot(df, aes(x=day)) +
    geom_bar(aes(y=pdf/max(pdf), fill = "PDF"), stat="identity", width=0.95) + 
    geom_line(aes(y=cdf, fill = "CDF"), show_guide = TRUE) + 
    xlab("Day") + ylab("") + 
    theme_bw() + 
    theme_update(panel.background = element_blank(), 
               panel.border=element_blank()) +
    scale_fill_manual(values = c(NA, "red"), 
                   breaks = c("PDF", "CDF"), 
                   name = element_blank(), 
                   guide = guide_legend(override.aes = list(linetype = c(0,1))))

Upvotes: 1

Related Questions