简体   繁体   中英

R Shiny - How to create a barplot that reacts according to the time unit (Week, Month, Year) and aggregates data by time unit

I generate a dataframe about a disease with the following variables:

  • Date (date of disease)
  • Cases (number of cases, by default, the number of cases is 1)
  • Week (week of disease case)
  • Month (month of disease case)
  • Year (year of disease case).

My ui is here:

library(shiny) 
library(dplyr)
library(lubridate)
library(ggplot2)
library(scales)

Disease<-data.frame(Date=seq(as.Date("2015/1/1"), as.Date("2017/1/1"), "days"),Cases=rep(1))
Disease$Week<-as.Date(cut(Disease$Date,breaks="week",start.on.monday = TRUE))
Disease$Month<-as.Date(cut(Disease$Date,breaks="month"))
Disease$Year<-as.Date(cut(Disease$Date,breaks="year"))

ui <- fluidPage(
      dateRangeInput("daterange", "Choice the date",
      start = min(Disease$Date),
      end = max(Disease$Date),
      min = min(Disease$Date),
      max = max(Disease$Date),
      separator = " - ", format = "dd/mm/yy",
      startview = 'Month', language = 'fr', weekstart = 1),
      selectInput(inputId = 'Time_unit',
      label='Time_unit',
      choices=c('Week','Month','Year'),
      selected='Month'),
plotOutput("Disease"))

I wish to create a barplot that reacts according to the time unit (ie week, month, year) and that agregates data by time unit

You will find below the code of the server (but it doesn't work) :

server <- function(input, output) {
       dateRangeInput<-reactive({
       dataset= subset(Disease, Date >= input$daterange[1] & Date <= 
       input$daterange[2])
       return(dataset)
       })
selectInput= reactive({
summarize(group_by(dateRangeInput(),
period = switch(input$Time_unit,
"Week"=Disease$Week,
"Month" = Disease$Month,
"Year" = Disease$Year)))
})

output$Disease <-renderPlot({
ggplot(data=selectInput(), aes_string(x="period",x="Cases"))  
+ stat_summary(fun.y = sum, geom = "bar") 
+ labs(title="Disease", y ="Number of cases")
+theme_classic() 
+theme(plot.title = element_text(hjust = 0.5))
})

}
shinyApp (ui = ui, server = server)

You will find below barplots thatI would like to obtain if I choose Week or Month or Year:

Sorry for "by Year", I can't to post more than 2 links

You can check this code out, it is working how You want:

library(shiny) 
library(dplyr)
library(lubridate)
library(ggplot2)
library(scales)

Disease<-data.frame(Date=seq(as.Date("2015/1/1"), as.Date("2017/1/1"), "days"),Cases=rep(1))
Disease <- Disease %>% mutate(Week = format(Date, "%Y-%m-%U"),Month = format(Date, "%Y-%m"), Year = format(Date, "%Y"))

ui <- fluidPage(
  dateRangeInput("daterange", "Choice the date",
                 start = min(Disease$Date),
                 end = max(Disease$Date),
                 min = min(Disease$Date),
                 max = max(Disease$Date),
                 separator = " - ", format = "dd/mm/yy",
                 startview = 'Month', language = 'fr', weekstart = 1),
  selectInput(inputId = 'Time_unit',
              label='Time_unit',
              choices=c('Week','Month','Year'),
              selected='Month'),
  plotOutput("Disease"))


server <- function(input, output) {
  dateRangeInput<-reactive({
    dataset <- subset(Disease, Date >= input$daterange[1] & Date <= input$daterange[2])
    dataset
  })
  selectInput= reactive({
    dataset <- dateRangeInput() %>% group_by_(input$Time_unit) %>% summarise(Sum = sum(Cases))
    print(head(dataset))
    dataset
    })

  output$Disease <-renderPlot({
    ggplot(data=selectInput(), aes_string(x=input$Time_unit,y="Sum"))  + geom_bar(stat="identity") + 
    labs(title="Disease", y ="Number of cases") +
    theme_classic() + 
    theme(plot.title = element_text(hjust = 0.5))
  })

}
shinyApp (ui = ui, server = server)

Plot is reactive to the Time_unit input, You just need to do small adjustment with the axis text and thats it.

PS Your second link to the image

by Week

is not working --> getting an empty space.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM