Search code examples
rggplot2separator

How to format legend using scale_color_discrete in stacked plot and have thousand separators included in the y-axis r


I have this dataset to work with to format legend and include thousand separator on the y-axis;

Data <- tibble::tribble(
  ~Site,    ~Test,    ~Score1,      ~Score2,       ~Score3,
  "A",   "SD",  5904,    9691,    NA, 
  "B",   "SD",   2697,    4484,    NA,
  "A ",   "MB",  11418,    7666,      NA,
  "B",   "MB", 2517,    6445,    NA,
  "C",   "FO",  NA,    NA,    9588,
  "C",   "FI", NA,    NA,    5423,
  "C",   "NF",  NA,    NA,    1527
)

I used this code;

 library(dplyr)
 library(tidyr)
 library(ggplot2)

 Data %>% 
  pivot_longer(cols = -c(Site,Test)) %>%
   mutate(Test = factor(Test,
                           levels = c('SD','MB','FI','FO','NF'),
                           ordered = T)) %>%
   ggplot(aes(x=Site,y=value,fill=name, legend = TRUE))+
   ylim(0,20000) +
   ylab("Total score") +
   geom_bar(stat='identity')+
   facet_wrap(.~Test, scales = 'free_x', ncol = 5, strip.position = "bottom")+
   theme_minimal()+
   theme(strip.placement  = "outside",
         panel.spacing    = unit(0, "points"),
         strip.background = element_blank(),
         strip.background.y = element_blank(),
         panel.background = element_rect(fill = "white"),
         panel.grid.major = element_blank(),
         panel.grid.minor = element_blank(),
         panel.border = element_blank(), 
         strip.text       = element_text(face = "bold", size = 9))+
   scale_color_discrete(name = "Legend",label=c("Score 1","Score 2","Score 3"))

I am failing to have my legend properly labeled and thousand separator on my y-values.


Solution

  • The only changes you have to do are:

    1. ylim(0, 20000) for scale_y_continuous(labels = scales::comma_format())
    2. scale_color_discrete() for scale_fill_discrete().
    Data %>%
      pivot_longer(cols = -c(Site,Test)) %>%
      mutate(Test = factor(Test,
                           levels = c('SD','MB','FI','FO','NF'),
                           ordered = T)) %>%
      ggplot(aes(x = Site, y = value, fill = name, legend = TRUE)) +
      scale_y_continuous(labels = scales::comma_format()) +
      ylab("Total score") +
      geom_bar(stat = 'identity') +
      facet_wrap(. ~ Test, scales = 'free_x', ncol = 5, strip.position = "bottom") +
      theme_minimal() +
      theme(strip.placement  = "outside",
            panel.spacing    = unit(0, "points"),
            strip.background = element_blank(),
            strip.background.y = element_blank(),
            panel.background = element_rect(fill = "white"),
            panel.grid.major = element_blank(),
            panel.grid.minor = element_blank(),
            panel.border = element_blank(), 
            strip.text = element_text(face = "bold", size = 9)) +
      scale_fill_discrete(name = "Legend", label = c("Score 1", "Score 2", "Score 3"))
    

    Here is the output:

    enter image description here

    Good luck!