Add linetype to geom_segment legend

997 Views Asked by At

Aim: add the linetypes of the segments to the legend, as well as the colour.

Problem: only the colour is showing.

Data:

m = as.data.frame(matrix(c(1:10), ncol = 2, nrow = 10))

Plot:

ggplot(m, aes(v1,v2)) + geom_segment(aes(x = 0, xend = 9.75, y = 10, yend = 10, colour = "PEL"), linetype = "dotted") + geom_segment(aes(x = 0, xend = 9.75, y = 5, yend = 5, colour = "AL1"), linetype = "longdash") + geom_segment(aes(x = 0, xend = 9.75, y = 2, yend = 2, colour = "ISQG"), linetype = "solid") + scale_colour_manual("legend", values = c("PEL" = "black", "AL1" = "blue", "ISQG" = "purple"), guide = guide_legend(override.aes = list(alpha = 1))) + theme(legend.position = "bottom")

I've tried adding scale_linetype_manual(values = c("PEL" = "dotted", "AL1" = "longdash", "ISQG" = "solid") but nothing changes.

This answer is similar, Legend linetype in ggplot but I couldn't figure out how to make it work with geom_segment

Thank you in advance

1

There are 1 best solutions below

1
On

The most ggplot-esque way of doing this, is to include a linetype variable as part of mapping in the aes() functions. You must then ensure that both the linetype and colour scales have the same titles, breaks, limits, labels etc.

Alternatively, you can also include the linetype in the override.aes part of guide_legend().

library(ggplot2)

ggplot() + 
  geom_segment(
    aes(x = 0, xend = 9.75, y = 10, yend = 10, colour = "PEL", linetype ="PEL"), 
  ) + 
  geom_segment(
    aes(x = 0, xend = 9.75, y = 5, yend = 5, colour = "AL1", linetype ="AL1"), 
  ) + 
  geom_segment(
    aes(x = 0, xend = 9.75, y = 2, yend = 2, colour = "ISQG", linetype = "ISQG"), 
  ) + 
  scale_colour_manual(
    "legend", 
    values = c("PEL" = "black", "AL1" = "blue", "ISQG" = "purple"), 
  ) + 
  scale_linetype_manual(
    "legend", 
    values = c("PEL" = "dotted", "AL1" = "longdash", "ISQG" = "solid"), 
  ) + 
  theme(legend.position = "bottom")

Created on 2022-05-19 by the reprex package (v2.0.1)