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分组条形图的主要内容,如果未能解决你的问题,请参考以下文章
R Shiny 如何在根据用户选择从 mysqlDB 检索数据时使用 renderPlot 构建条形图