rggplot2plotscale-color-manual

control overlaying lines while color is continuous value in ggplot


I have a data and would like to plot the lines and have control over the order that lines are laying on top of each other.

I would like to use 'cale_color_viridis()' as my pallet. I have no idea how can plot the lighter(yellow) line on the darker ones.

Here is my toy data frame and my code:

toy_data <- data.frame(x = c(1,3,1,2,5,0), y = c(0, 01, 1, 0.6, 1, .7), 
                  col = rep(c("r", "b", "g"), each = 2), group = seq(0,1, by = 0.2))
ggplot(toy_data, aes(x = x, y = y, group = col, color = group)) +
geom_line(size = 2) +
scale_color_viridis()

any idea how can I do this?


Solution

  • The group aesthetic determines the plotting order, in this case, the col variable which is character data. It will normally plot in alphabetical order (b g r), so to get the yellow line from col "g" to print last, you could convert it to a factor ordered in order of appearance, like with forcats::fct_inorder:

    ggplot(toy_data, 
           aes(x = x, y = y, group = col %>% forcats::fct_inorder(), color = group)) +
      geom_line(size = 2) +
      scale_color_viridis_c()   # added in ggplot2 3.0 in July 2018. 
                                # scale_color_viridis for older ggplot2 versions
    

    enter image description here

    If col is numeric, you could achieve the same thing by giving your "top" series the biggest number.

    toy_data2 <- data.frame(x = c(1,3,1,2,5,0), y = c(0, 01, 1, 0.6, 1, .7), 
                           col = rep(c(3, 1, 2), each = 2), group = seq(0,1, by = 0.2))
    
    ggplot(toy_data2, 
           aes(x = x, y = y, group = if_else(col == 2, 1e10, col), color = group)) +
      geom_line(size = 2) +
      scale_color_viridis_c()