Линейчатая диаграмма с плотной группировкой в RShiny

#r #ggplot2 #graph #shiny #plotly

#r #ggplot2 #График #блестящий #плотная

Вопрос:

Я пытаюсь создать сгруппированную гистограмму, используя Plotly и RShiny, где пользователь может выбрать переменную для группировки и отображения на оси x (называемую xvar()), и переменную, которая разбивает переменную xaxis на дополнительные группы (называемые xsubvar()).

Я пытаюсь отобразить среднее значение переменной AVAL по оси y.

Вот мой текущий код:

 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)))
  })
  

Это приводит к следующему графику:
График1

Как вы можете видеть, группы разделены так, как я хотел бы, но 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))
  

Это генерирует следующий график:
График 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))
            )
          ))