Search code examples
ggplot2manualvline

ggplot2 - add manual legend to multiple layers


I have a ggplot in which I am using color for my geom_points as a function of one of my columns(my treatment) and then I am using the scale_color_manual to choose the colors.

I automatically get my legend right

The problem is I need to graph some horizontal lines that have to do with the experimental set up, which I am doing with geom_vline, but then I don't know how to manually add a separate legend that doesn't mess with the one I already have and that states what those lines are.

I have the following code

ggplot(dcons.summary, aes(x = meters, y = ymean, color = treatment, shape = treatment)) +
  geom_point(size = 4) +
  geom_errorbar(aes(ymin = ymin, ymax = ymax)) + 
  scale_color_manual(values=c("navy","seagreen3"))+
  theme_classic() + 
  geom_vline(xintercept = c(0.23,3.23, 6.23,9.23), color= "bisque3", size=0.4) +
  scale_x_continuous(limits = c(-5, 25)) +
  labs(title= "Sediment erosion", subtitle= "-5 -> 25  meters; standard deviation; consistent measurements BESE & Control", x= "distance (meters)", y="erosion (cm)", color="Treatment", shape="Treatment")

enter image description here

So I would just need an extra legend beneath the "treatment" one that says "BESE PLOTS LOCATION" and that is related to the gray lines

I have been searching for a solution, I've tried using "scale_linetype_manual" and also "guides", but I'm not getting there


Solution

  • As you provided no reproducible example, I used data from the mtcars dataset. In addition I modified this similar answer a little bit. As you already specified the color and in addition the fill factor is not working here, you can use the linetype as a second parameter within aes wich can be shown in the legend:

    xid <- data.frame(xintercept = c(15,20,30), lty=factor(1))
    mtcars %>% 
       ggplot(aes(mpg ,cyl, col=factor(gear))) + 
          geom_point() + 
          geom_vline(data=xid, aes(xintercept=xintercept, lty=lty) , col = "red", size=0.4) +
          scale_linetype_manual(values = 1, name="",label="BESE PLOTS LOCATION")
    

    enter image description here

    Or without the second data.frame:

       ggplot() + 
          geom_point(data = mtcars,aes(mpg ,cyl, col=factor(gear))) + 
          geom_vline(aes(xintercept=c(15,20,30), lty=factor(1) ), col = "red", size=0.4)+
          scale_linetype_manual(values = 1, name="",label="BESE PLOTS LOCATION")