Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add legend to manually added lines using ggplot

Tags:

plot

r

ggplot2

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!

like image 558
user54517 Avatar asked Oct 05 '14 16:10

user54517


People also ask

How do I add a legend in ggplot2?

You can place the legend literally anywhere. To put it around the chart, use the legend. position option and specify top , right , bottom , or left . To put it inside the plot area, specify a vector of length 2, both values going between 0 and 1 and giving the x and y coordinates.

How do you add a legend to multiple lines in R?

Adding Legends There is no direct way in R to add legends in case of multiple lines like in Excel and other scripting languages. So, to add legends we need to distribute the lines into multiple groups on the basis of coloring.

Why doesn't my Ggplot have a legend?

If you want to add a legend to a ggplot2 chart you will need to pass a categorical (or numerical) variable to color , fill , shape or alpha inside aes . Depending on which argument you use to pass the data and your specific case the output will be different.

How do I change the legend value in ggplot2?

You can use the following syntax to change the legend labels in ggplot2: p + scale_fill_discrete(labels=c('label1', 'label2', 'label3', ...))


1 Answers

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

like image 106
Roland Avatar answered Sep 22 '22 22:09

Roland