R Shiny中的Plotly分组条形图

Posted

技术标签:

【中文标题】R Shiny中的Plotly分组条形图【英文标题】:Plotly Grouped Bar Chart in RShiny 【发布时间】:2021-01-18 04:56:35 【问题描述】:

我正在尝试使用 Plotly 和 RShiny 创建一个分组条形图,其中用户可以选择一个变量来分组并显示在 xaxis 上(称为 xvar()),以及一个将 xaxis 变量分成更多组的变量(称为 xsubvar())。

我试图在 y 轴上显示变量 AVAL 的平均值。

这是我当前的代码:

barGraphGrouped <- reactive(
    
    filteredData() %>% group_by(xvar(),xsubvar()) %>% mutate(n=n_distinct(USUBJID)) %>% 
      plot_ly(x=xvar(),y=filteredData()$AVAL,type="bar",text =~paste('n =',n), textposition = 'outside',
              textfont = list(size = 14),
              transforms = list(
                list(
                  type = 'aggregate',
                  groups = xvar(),
                  aggregations = list(list(target = 'y', func = 'avg', enabled = T))
                )
              )) %>%
      add_trace(x=xsubvar(),y=filteredData()$AVAL,
                transforms = list(
                  list(
                    type = 'aggregate',
                    groups = xsubvar(),
                    aggregations = list(list(target = 'y', func = 'avg', enabled = T))
                  )
                )) %>%
      layout(barmode='group',title=paste("Average AVAL by",input$xradio),
             xaxis = list(title = input$xradio,tickfont = list(size = 13)), 
             yaxis = list(title = input$yradio,tickfont = list(size = 13)))
  )

这导致以下情节: Plot1

如您所见,各组按我希望的方式进行拆分,但每个条形顶部的 n 和平均 AVAL 没有按我希望的那样计算。

我已经使用以下代码创建了我希望在 ggplot 中完成的确切图表:

myplot <- filteredData() %>% group_by(xvar(),xsubvar()) %>%
       dplyr::mutate(AVAL=mean(AVAL)) %>%
       ggplot(aes(x=xvar(),y=AVAL,fill=xsubvar(),label=xsubvar()))+
       geom_col(stat="identity",position = position_dodge(.9))+
       scale_fill_brewer(palette = "Set1") +
       theme_classic()+
       ggtitle(paste("Average AVAL by",input$xradio,"and",input$xsubradio))+
       ylab(input$yradio)+
       xlab(input$xradio)+
       scale_x_discrete(labels=names(xvar()))+
       geom_text(position = position_dodge(.9),size=3)+
       theme(
         legend.position = "none",
         panel.grid.major.y = element_blank(),
       )

ggplotly(myplot) %>% layout(legend = list(orientation = "h", x = 0.4, y = -0.2))

这会生成以下图: Plot 2

但是我想弄清楚如何在 plotly 中重新创建,因为我更喜欢 plotly 中的视觉输出和自定义选项。

谢谢!

【问题讨论】:

【参考方案1】:

没有样本数据,很难验证问题。请试试这个

filteredData() %>% group_by(xvar(),xsubvar()) %>% mutate(n=mean(AVAL)) %>% 
  plot_ly(x=xvar(),y=n,type="bar",text =~paste('n =',n), textposition = 'outside',
          textfont = list(size = 14),
          transforms = list(
            list(
              type = 'aggregate',
              groups = xvar(),
              aggregations = list(list(target = 'y', func = 'avg', enabled = T))
            )
          ))

【讨论】:

以上是关于R Shiny中的Plotly分组条形图的主要内容,如果未能解决你的问题,请参考以下文章

Plotly 分组条形图:单个元素的悬停信息

R Shiny 如何在根据用户选择从 mysqlDB 检索数据时使用 renderPlot 构建条形图

用 plotly 创建一个稍微重叠的条形图

R Plotly:右侧 Y 轴的水平条形图

Plotly:如何使用 go.Bar 向堆积条形图添加数据标签?

R Shiny ggplot 条形图和折线图,具有动态变量选择和 y 轴为百分比