Add legend to manually added lines using ggplot

14,992

The trick is to use appropriate mapping:

gplot <- ggplot(df, aes(x=1:length(error), y=error)) +
  scale_x_continuous(breaks = seq_along(df$error)) +
  geom_point(size = 3) +
  geom_line() +
  geom_errorbar(data = df, aes(x = 1:length(error), ymin = error - sDev, ymax = error + sDev), 
                width = 0.1) + 
  geom_hline(data = df, aes(yintercept = error[minimum] + sDev[minimum], linetype="a", colour="a")) +
  geom_vline(data= data.frame(type="b", col="b", minimum=minimum), 
             aes(linetype=type, colour=col, xintercept = minimum), size = 1, show_guide = TRUE) +
  geom_vline(data= data.frame(type="b", col="b", best.model=best.model),
             aes(linetype="c", colour="c", xintercept = best.model), size = 1, show_guide = TRUE) +
  scale_colour_manual(name="Legend", values = c("a" = "black", "b" = "red", "c" = "blue")) +
  scale_linetype_manual(name="Legend", values = c("a" = "dashed", "b" = "dotted", "c" = "dotted")) +
  theme_gray(base_size = 18) + 
  theme(axis.text = element_text(color = "black"),
        legend.key.height  = grid::unit(0.1, "npc")) +
  labs(x = "# of parameters", fontface = "bold") + 
  labs(y = "CV error") +
  labs(title = "Cross-validation error curve")

resulting plot

Share:
14,992

Related videos on Youtube

user54517
Author by

user54517

Updated on September 15, 2022

Comments

  • user54517
    user54517 over 1 year

    I'm trying to add the corresponding legend for 3 manually added lines using ggplot. My code is the following:

    library(ggplot2)
    df = data.frame(error = c(0.0832544999, 0.0226680026, 0.0082536264, 0.0049199958, 0.0003917755, 0.0003859976, 0.0003888253, 0.0003953918, 0.0003958398), sDev = c(8.188111e-03, 2.976161e-03, 1.466221e-03, 2.141425e-03, 2.126976e-05, 2.139364e-05, 2.169059e-05, 2.629895e-05, 2.745938e-05))
    
    minimum <- 6
    best.model <- 5
    
    gplot <- ggplot(df, aes(x=1:length(error), y=error)) +
                 scale_x_continuous(breaks = seq_along(df$error)) +
                 geom_point(size = 3) +
                 geom_line() +
                 geom_errorbar(data = df, aes(x = 1:length(error), ymin = error - sDev, ymax = error + sDev), 
                               width = 0.1) + 
                 geom_hline(data = df, aes(yintercept = error[minimum] + sDev[minimum]), linetype = "dashed") +
                 geom_vline(xintercept = minimum, linetype = "dotted", color = "red", size = 1) +
                 geom_vline(xintercept = best.model, linetype = "dotted", color = "blue", size = 1) +
                 theme_gray(base_size = 18) + 
                 theme(axis.text = element_text(color = "black")) +
                 labs(x = "# of parameters", fontface = "bold") + 
                 labs(y = "CV error") +
                 labs(title = "Cross-validation error curve")
    

    enter image description here

    I'd like to know how to add the legends for the 3 dotted lines in black, red, and blue.

    Thanks a lot in advance!