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

我与影子孤独终老i 提交于 2021-01-01 10:16:24

问题


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!!


回答1:


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)




回答2:


If you have both of your plots and want them to display in one figure you could use the following I guess:

fig <- subplot(fig1, fig2)


来源:https://stackoverflow.com/questions/64154396/combining-both-grouped-bar-chart-and-stacked-bar-chart-using-r-plotly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!