Search code examples
rplotlyr-plotly

Combining both grouped bar chart and stacked bar chart using R Plotly


I am trying to combine both stacked bar and grouped bar chart using plot_ly(). I came across a few questions but couldn't get the perfect solution for this scenario.

I came across the solution using ggplot2. But I need to implement using plot_ly

This is the data frame I am trying to plot

structure(list(QuarterYear = c("Q4 2019", "Q4 2019", "Q4 2019", 
"Q4 2019", "Q4 2019", "Q4 2019", "Q4 2019", "Q4 2019", "Q4 2019", 
"Q4 2019", "Q4 2019", "Q4 2019", "Q1 2020", "Q1 2020", "Q1 2020", 
"Q1 2020", "Q1 2020", "Q1 2020", "Q1 2020", "Q1 2020", "Q1 2020", 
"Q1 2020", "Q1 2020", "Q1 2020", "Q2 2020", "Q2 2020", "Q2 2020", 
"Q2 2020", "Q2 2020", "Q2 2020", "Q2 2020", "Q2 2020", "Q2 2020", 
"Q2 2020", "Q2 2020", "Q2 2020", "Q3 2020", "Q3 2020", "Q3 2020", 
"Q3 2020", "Q3 2020", "Q3 2020", "Q3 2020", "Q3 2020", "Q3 2020", 
"Q3 2020", "Q3 2020", "Q3 2020"), Grade = c("Grade 8", "Grade 8", 
"Grade 8", "Grade 9", "Grade 9", "Grade 9", "Grade 10", "Grade 10", 
"Grade 10", "Grade 11", "Grade 11", "Grade 11", "Grade 8", "Grade 8", 
"Grade 8", "Grade 9", "Grade 9", "Grade 9", "Grade 10", "Grade 10", 
"Grade 10", "Grade 11", "Grade 11", "Grade 11", "Grade 8", "Grade 8", 
"Grade 8", "Grade 9", "Grade 9", "Grade 9", "Grade 10", "Grade 10", 
"Grade 10", "Grade 11", "Grade 11", "Grade 11", "Grade 8", "Grade 8", 
"Grade 8", "Grade 9", "Grade 9", "Grade 9", "Grade 10", "Grade 10", 
"Grade 10", "Grade 11", "Grade 11", "Grade 11"), Type = c("overallAverage", 
"CT", "RT", "overallAverage", "CT", "RT", "overallAverage", "CT", 
"RT", "overallAverage", "CT", "RT", "overallAverage", "CT", "RT", 
"overallAverage", "CT", "RT", "overallAverage", "CT", "RT", "overallAverage", 
"CT", "RT", "overallAverage", "CT", "RT", "overallAverage", "CT", 
"RT", "overallAverage", "CT", "RT", "overallAverage", "CT", "RT", 
"overallAverage", "CT", "RT", "overallAverage", "CT", "RT", "overallAverage", 
"CT", "RT", "overallAverage", "CT", "RT"), value = c(2.48, 2.21, 
0.27, 3.48, 3.03, 0.45, 4.6, 4, 0.6, 2.8, 2.4, 0.4, 2.54, 2.28, 
0.26, 3.45, 3, 0.45, 4.46, 3.88, 0.58, 3.56, 2.81, 0.75, 2.47, 
2.14, 0.33, 2.96, 2.54, 0.41, 4.1, 3.69, 0.41, 3.44, 2.61, 0.83, 
2, 1.81, 0.19, 2.54, 2.26, 0.28, 4.11, 3.68, 0.43, 2.67, 2.11, 
0.56)), row.names = c(NA, -48L), class = "data.frame")

I am aware that we need to define the barmode as stack for stacked bar and group for grouped bar chart. I'm not aware of now to combine these barmode in one single plot using plot_ly

Can anyone provide a suitable solution in R?

Thanks in advance!!


Solution

  • Here is the best plot_ly can do:

    library(plotly)
    library(tidyverse)
    
    dat <- tibble(QuarterYear = c("Q4 2019", "Q4 2019", "Q4 2019", 
                                  "Q4 2019", "Q4 2019", "Q4 2019", "Q4 2019", "Q4 2019", "Q4 2019", 
                                  "Q4 2019", "Q4 2019", "Q4 2019", "Q1 2020", "Q1 2020", "Q1 2020", 
                                  "Q1 2020", "Q1 2020", "Q1 2020", "Q1 2020", "Q1 2020", "Q1 2020", 
                                  "Q1 2020", "Q1 2020", "Q1 2020", "Q2 2020", "Q2 2020", "Q2 2020", 
                                  "Q2 2020", "Q2 2020", "Q2 2020", "Q2 2020", "Q2 2020", "Q2 2020", 
                                  "Q2 2020", "Q2 2020", "Q2 2020", "Q3 2020", "Q3 2020", "Q3 2020", 
                                  "Q3 2020", "Q3 2020", "Q3 2020", "Q3 2020", "Q3 2020", "Q3 2020", 
                                  "Q3 2020", "Q3 2020", "Q3 2020"), 
                  Grade = c("Grade 8", "Grade 8", 
                            "Grade 8", "Grade 9", "Grade 9", "Grade 9", "Grade 10", "Grade 10", 
                            "Grade 10", "Grade 11", "Grade 11", "Grade 11", "Grade 8", "Grade 8", 
                            "Grade 8", "Grade 9", "Grade 9", "Grade 9", "Grade 10", "Grade 10", 
                            "Grade 10", "Grade 11", "Grade 11", "Grade 11", "Grade 8", "Grade 8", 
                            "Grade 8", "Grade 9", "Grade 9", "Grade 9", "Grade 10", "Grade 10", 
                            "Grade 10", "Grade 11", "Grade 11", "Grade 11", "Grade 8", "Grade 8", 
                            "Grade 8", "Grade 9", "Grade 9", "Grade 9", "Grade 10", "Grade 10", 
                            "Grade 10", "Grade 11", "Grade 11", "Grade 11"), 
                  Type = c("overallAverage", 
                           "CT", "RT", "overallAverage", "CT", "RT", "overallAverage", "CT", 
                           "RT", "overallAverage", "CT", "RT", "overallAverage", "CT", "RT", 
                           "overallAverage", "CT", "RT", "overallAverage", "CT", "RT", "overallAverage", 
                           "CT", "RT", "overallAverage", "CT", "RT", "overallAverage", "CT", 
                           "RT", "overallAverage", "CT", "RT", "overallAverage", "CT", "RT", 
                           "overallAverage", "CT", "RT", "overallAverage", "CT", "RT", "overallAverage", 
                           "CT", "RT", "overallAverage", "CT", "RT"), 
                  value = c(2.48, 2.21, 
                            0.27, 3.48, 3.03, 0.45, 4.6, 4, 0.6, 2.8, 2.4, 0.4, 2.54, 2.28, 
                            0.26, 3.45, 3, 0.45, 4.46, 3.88, 0.58, 3.56, 2.81, 0.75, 2.47, 
                            2.14, 0.33, 2.96, 2.54, 0.41, 4.1, 3.69, 0.41, 3.44, 2.61, 0.83, 
                            2, 1.81, 0.19, 2.54, 2.26, 0.28, 4.11, 3.68, 0.43, 2.67, 2.11, 
                            0.56))
    
     
     q4_2019 <- dat %>% filter(QuarterYear == "Q4 2019") %>%
      group_by(Grade) %>% 
      arrange(Grade) %>%
      plot_ly(
       x = ~Type, 
       y = ~value, 
       color= ~Grade,
       colors = 'Reds',
       type = 'bar', 
       legendgroup=~Grade) %>% 
      layout(xaxis = list(title = "Q4 2019"))
     
     q1_2020 <- dat %>% filter(QuarterYear == "Q1 2020") %>%
      group_by(Grade) %>% 
      arrange(Grade) %>%
      plot_ly(
       x = ~Type, 
       y = ~value, 
       color= ~Grade,
       colors = 'Reds',
       type = 'bar', 
       legendgroup=~Grade, 
       showlegend = FALSE) %>% 
      layout(xaxis = list(title = "Q1 2020"))
     
     
     q2_2020 <- dat %>% filter(QuarterYear == "Q2 2020") %>%
      group_by(Grade) %>% 
      arrange(Grade) %>%
      plot_ly(
       x = ~Type, 
       y = ~value, 
       color= ~Grade,
       colors = 'Reds',
       type = 'bar', 
       legendgroup=~Grade, 
       showlegend = FALSE) %>% 
      layout(xaxis = list(title = "Q2 2020"))
     
     q3_2020 <- dat %>% filter(QuarterYear == "Q3 2020") %>%
      group_by(Grade) %>% 
      arrange(Grade) %>%
      plot_ly(
       x = ~Type, 
       y = ~value, 
       color= ~Grade,
       colors = 'Reds',
       type = 'bar',
       legendgroup =~Grade,
       showlegend = FALSE) %>% 
      layout(xaxis = list(title = "Q3 2020"))
     
    subplot(q4_2019, q1_2020, q2_2020, q3_2020, titleX = TRUE, shareY = T) %>%
      layout(barmode = 'stack', showlegend = TRUE)
    

    subplots and stacked bars in plot_ly