Search code examples
rlegendlinegrapherrorbar

showing three factors in line graph


I am trying to make a line graph with three factors. In addition, I would like to have my legend labels have two symbols.

This is the published example I am trying to emulate....

desired style

as you can see, each label has two symbols, one for each level of one factor. Furthermore, the same factor is shown twice on the same panel for each level, i.e. cultivar with two different levels of a factor.

I am trying to make one panel at a time, I will join them later and put the legend at the top like in the above example.

Here is the start of my attempt....

My attempt

I have got my points on the graph, though im baffled as to how to make a line join through each cultivar, show error bars, and make the legend similar to the above example. I want the legend to have one label for each cultivar, but with two symbols, one symbol for Waterlogging and one for Non-waterlogging

structure(list(pot = c(41L, 42L, 43L, 44L, 61L, 62L, 63L, 64L, 
45L, 46L, 47L, 48L, 65L, 66L, 67L, 68L, 49L, 50L, 51L, 52L, 69L, 
70L, 71L, 72L, 53L, 54L, 55L, 56L, 73L, 74L, 75L, 76L, 57L, 58L, 
59L, 60L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 101L, 102L, 
103L, 104L, 85L, 86L, 87L, 88L, 105L, 106L, 107L, 108L, 89L, 
90L, 91L, 92L, 109L, 110L, 111L, 112L, 93L, 94L, 95L, 96L, 113L, 
114L, 115L, 116L, 97L, 98L, 99L, 100L, 117L, 118L, 119L, 120L
), rep = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L, 3L, 4L), cultivar = structure(c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Dinninup", "Riverina", 
"Seaton Park", "Yarloop"), class = "factor"), Waterlogging = structure(c(2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("Non-waterlogged", 
"Waterlogged"), class = "factor"), P = c(12.1, 12.1, 12.1, 12.1, 
12.1, 12.1, 12.1, 12.1, 15.17, 15.17, 15.17, 15.17, 15.17, 15.17, 
15.17, 15.17, 18.24, 18.24, 18.24, 18.24, 18.24, 18.24, 18.24, 
18.24, 24.39, 24.39, 24.39, 24.39, 24.39, 24.39, 24.39, 24.39, 
48.35, 48.35, 48.35, 48.35, 48.35, 48.35, 48.35, 48.35, 12.1, 
12.1, 12.1, 12.1, 12.1, 12.1, 12.1, 12.1, 15.17, 15.17, 15.17, 
15.17, 15.17, 15.17, 15.17, 15.17, 18.24, 18.24, 18.24, 18.24, 
18.24, 18.24, 18.24, 18.24, 24.39, 24.39, 24.39, 24.39, 24.39, 
24.39, 24.39, 24.39, 48.35, 48.35, 48.35, 48.35, 48.35, 48.35, 
48.35, 48.35), form = c(2.81, 2.64, 2.59, 3.28, 3.18, 2.57, 2.9, 
3, 2.38, 2.72, 2.58, 2.73, 3.06, 3.01, 3.01, 2.77, 2.95, 2.36, 
2.91, 2.38, 3.33, 3.19, 3.17, 3.16, 3.16, 3.2, 2.58, 3.71, 3.11, 
2.7, 2.92, 1.93, 2.95, 2.57, 2.68, 2.48, 3.34, 2.75, 2.52, 1.88, 
1.19, 0.57, 0.64, 0.66, 1.13, 1.28, 0.85, 0.96, 1.34, 2.14, 0.63, 
1.27, 1.13, 0.64, 1.21, 1.95, 1.11, 0.91, 0.75, 0.63, 1.06, 1.07, 
1.05, 0.8, 1.41, 1.13, 0.75, 0.89, 1.98, 1.27, 1.01, 1, 1.16, 
0.64, 0.64, 1.02, 1.03, 1.13, 0.79, 0.6)), row.names = 41:120, class = "data.frame")


library(Rmisc)
library(ggplot2)

tglf3 <- summarySE(yar, measurevar="form", groupvars=c("P","cultivar","Waterlogging"),na.rm=TRUE)

ggplot(tglf3, aes(x=P, y=form)) + 
geom_point(aes(colour = factor(Waterlogging), 
shape=factor(cultivar)),size=3.5,position=position_dodge(1))+
geom_errorbar(aes(ymin=form-se, ymax=form+se),colour="black", width=.1,position=position_dodge(1)) 

Solution

  • Is this approaching what you're looking for?

    library(tidyverse)
    tglf3 <- summarySE(yar, measurevar="form", groupvars=c("P","cultivar","Waterlogging"),na.rm=TRUE)
    

    Mostly, making use of dplyr::group_by can solve the point-line pairing:

    tglf3 %>% 
      group_by(cultivar) %>% 
      ggplot(aes(x=P, y=form, colour=Waterlogging, shape=cultivar)) + 
      geom_errorbar(aes(ymin=form-se, ymax=form+se), colour="black", width=.6) +
      geom_point(size=3.5) +
      geom_line() +
      theme_classic() +
      theme(legend.position = 'top', legend.direction="vertical")
    

    enter image description here


    More formatting using scale_x_manual:

    tglf3 %>% 
      unite(new, cultivar, Waterlogging, sep = ', ') %>% 
      group_by(new) %>% 
      ggplot(aes(x=P, y=form, colour=new, shape=new, linetype=new)) + 
      geom_errorbar(aes(ymin=form-se, ymax=form+se), colour="black", width=.6) +
      geom_line(color="black") + 
      geom_point(size=3.5) +
      scale_colour_manual(name = "Cultivar, Waterlogging",
                          labels = c("Riverina, Non-waterlogged", "Riverina, Waterlogged", "Yarloop, Non-waterlogged", "Yarloop, Waterlogged"),
                          values = c("blue", "red", "blue", "red")) +
      scale_shape_manual(name = "Cultivar, Waterlogging",
                         labels = c("Riverina, Non-waterlogged", "Riverina, Waterlogged", "Yarloop, Non-waterlogged", "Yarloop, Waterlogged"),
                         values = c(19, 19, 17, 17)) +
      scale_linetype_manual(name = "Cultivar, Waterlogging", values=c("longdash", "solid", "longdash", "solid")) +
      theme_classic() +
      theme(legend.position = 'top', legend.direction="vertical") +
      guides(color=guide_legend(ncol=2))
    

    enter image description here


    Without %>%:

    tglf4 <- unite(data = tglf3, new, cultivar, Waterlogging, sep = ', ')
    tglf5 <- group_by(.data = tglf4, new)
    
    ggplot(tglf5, aes(x=P, y=form, colour=new, shape=new, linetype=new)) + 
    geom_errorbar(aes(ymin=form-se, ymax=form+se), colour="black", width=.6) +
    geom_line(color="black") + 
    geom_point(size=3.5) +
    scale_colour_manual(name = "Cultivar, Waterlogging",
                        labels = c("Riverina, Non-waterlogged", "Riverina, Waterlogged", "Yarloop, Non-waterlogged", "Yarloop, Waterlogged"),
                        values = c("blue", "red", "blue", "red")) +
    scale_shape_manual(name = "Cultivar, Waterlogging",
                       labels = c("Riverina, Non-waterlogged", "Riverina, Waterlogged", "Yarloop, Non-waterlogged", "Yarloop, Waterlogged"),
                       values = c(19, 19, 17, 17)) +
    scale_linetype_manual(name = "Cultivar, Waterlogging", values=c("longdash", "solid", "longdash", "solid")) +
    theme_classic() +
    theme(legend.position = 'top', legend.direction="vertical") +
    guides(color=guide_legend(ncol=2))
    

    Using facet_grid (example using fake data):

    tglf3 %>% 
      mutate(
        form = form * 1.5
      ) %>% 
      bind_rows(tglf3, .id = 'species') %>% # Add fake data to the real data as an example
      mutate(
        species = case_when(species == 1 ~ 'O. sativus',
                            T ~ 'O. compressus')
      ) %>% 
      unite(new, cultivar, Waterlogging, sep = ', ') %>% 
      group_by(new) %>% 
      ggplot(aes(x=P, y=form, colour=new, shape=new, linetype=new)) + 
      geom_errorbar(aes(ymin=form-se, ymax=form+se), colour="black", width=.6) +
      geom_line(color="black") + 
      geom_point(size=3.5) +
      scale_colour_manual(name = "Cultivar, Waterlogging",
                          labels = c("Riverina, Non-waterlogged", "Riverina, Waterlogged", "Yarloop, Non-waterlogged", "Yarloop, Waterlogged"),
                          values = c("blue", "red", "blue", "red")) +
      scale_shape_manual(name = "Cultivar, Waterlogging",
                         labels = c("Riverina, Non-waterlogged", "Riverina, Waterlogged", "Yarloop, Non-waterlogged", "Yarloop, Waterlogged"),
                         values = c(19, 19, 17, 17)) +
      scale_linetype_manual(name = "Cultivar, Waterlogging", values=c("longdash", "solid", "longdash", "solid")) +
      theme_classic() +
      theme(legend.position = 'top', legend.direction="vertical") +
      guides(color=guide_legend(ncol=2)) +
      facet_grid(.~species)
    

    enter image description here