微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当用户输入的值发生变化时,在 Shiny Dashboard 的 ggplot 中显示动态百分比和数量值

如何解决当用户输入的值发生变化时,在 Shiny Dashboard 的 ggplot 中显示动态百分比和数量值

我正在尝试在闪亮的仪表板中的 ggplot 中显示百分比和数量标签,应根据用户对 ggplot 的输入进行更新。

我的数据集如下所示:

Week      Region   Flag    Warehouse  TAT       Quantity 
2021-W01  north    Local   ABC        In TAT    10
2021-W01  north    Local   ABC        Out TAT   5
2021-W01  East     Local   ABC        In TAT    13
2021-W01  East     Local   ABC        Out TAT   6
2021-W02  West     UPC     XYZ        In TAT    15
2021-W02  West     UPC     XYZ        Out TAT   10

这里Week是一年中的周数,Region代表north/East/West/South,Flag只有Local和UPC两个值是运动类型,Warehouse代表不同的仓库,TAT栏显示的是业绩部分。如果是 In tat 性能好,如果它 out 性能很差。

我现在取得的成就:

我已经能够在闪亮的仪表板中创建绘图和过滤器,并根据用户输入进行更新。但我无法向其中添加标签,这些标签会根据用户输入动态更改。

enter image description here

代码

library(plotly)
library(ggplot2)
library(dplyr)
library(reshape2)
library(gtools)

ui <- shinyUI(
  
  navbarPage(
    title = 'Dashboard',tabPanel('Performance',tabsetPanel(
               tabPanel('View1',selectInput('warehouse','Select Warehouse',unique(plot1$shipment_fc)),selectInput('region','Select Region',unique(plot1$regional_zone)),selectInput('mov_type','Select Movement Type',unique(plot1$flag)),fluidRow(
                          plotlyOutput("myplot_fwd")
                        )
               ),tabPanel('View 2'
               )
             ))
    
    
    )
  )

server <- function(input,output) {
  output$myplot_fwd <- renderPlotly({
    plot1 <- read.csv("plot1.csv",sep = ",",header = TRUE)
    
        data <- plot1 %>%
  filter(Warehouse == input$warehouse,Region == input$region,flag == input$mov_type)

p<- ggplot(data,aes(fill=TAT,y=Quantity,x=Week)) + 
  geom_bar(position="fill",stat="identity",colour="black") + 
  labs(x = "Week") +
  labs(y = "Percentage") +
  labs(title = "Performance") +
  scale_y_continuous(labels=scales::percent) 
 p <- ggplotly(p,tooltip="text")
    p
    
  })
  
  
}

shinyApp(ui,server)

我尝试更新我的渲染图部分以显示百分比:

  output$myplot_fwd <- renderPlotly({
    plot1 <- read.csv("plot1.csv",header = TRUE)
    
    data <- plot1 %>%
      filter(Warehouse == input$warehouse,flag == input$mov_type)
    
    p<- ggplot(data,x=Week)) + 
      geom_bar(position="fill",colour="black") + 
      labs(x = "Week") +
      labs(y = "Percentage") +
      labs(title = "Performance") +
      scale_y_continuous(labels=scales::percent) +
    geom_text(aes(label = Quantity),position = position_stack(vjust = 0.5))
    geom_text(data = . %>%
                filter(Warehouse == input$warehouse,flag == input$flag) %>%
                group_by(Week,TAT) %>%
                mutate(p = Quantity / sum(Quantity)) %>%
                ungroup(),aes(y = p,label = scales::percent(p)),position = position_stack(vjust = 3.25),show.legend = FALSE)
    p <- ggplotly(p,tooltip="text")
    p
    
  })

但这是显示错误的结果并破坏了情节 例如:

enter image description here

有没有一种方法可以在 GGplot 中正确显示百分比和数量标签(如果可能的话)。 任何帮助将不胜感激。 谢谢。

解决方法

试试这个:

output$myplot_fwd <- renderPlotly({
    plot1 <- read.csv("plot1.csv",sep = ",",header = TRUE)
    
    data <- plot1 %>%
      filter(Warehouse == input$warehouse,Region == input$region,Flag == input$mov_type) %>%
      group_by(Week) %>% 
      mutate(label = prop.table(Quantity) * 100)
    
    
    p <- ggplot(data,aes(fill=TAT,y=label,x=Week,label  = paste0(round(label,2),'%'))) + 
      geom_col(colour="black") + 
      labs(x = "Week") +
      labs(y = "Percentage") +
      labs(title = "Performance") +
      geom_text(position = position_stack(vjust = 0.5))
    
    p <- ggplotly(p,tooltip="text")
    p
    
  })

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。