【问题标题】:R Shiny - How to create a barplot that reacts according to the time unit (Week, Month, Year) and aggregates data by time unitR Shiny - 如何创建根据时间单位(周、月、年)做出反应并按时间单位聚合数据的条形图
【发布时间】:2017-11-24 04:50:28
【问题描述】:

我使用以下变量生成有关疾病的数据框:

  • 日期(发病日期)
  • 案例(案例数量,默认情况下,案例数量为1)
  • 周(病例周)
  • 月份(发病月份)
  • 年份(发病年份)。

我的用户界面在这里:

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

我希望创建一个根据时间单位(即周、月、年)做出反应并按时间单位聚合数据的条形图

您会在下面找到服务器的代码(但它不起作用):

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)

如果我选择周、月或年,您会发现以下条形图:

对不起,“按年份”,我不能发布超过 2 个链接

【问题讨论】:

  • 我忘了说:你好!

标签: r date shiny dplyr reactive


【解决方案1】:

您可以查看此代码,它的工作方式是您想要的:

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)

绘图对Time_unit 输入有反应,您只需要对轴文本进行小幅调整即可。

附:您的第二个图片链接

按周

不工作 --> 得到一个空白空间。

【讨论】:

  • 亲爱的 Malvina_a,非常完美。我感谢你的帮助。对不起图片。如果可能的话,我有最后一个问题。如果我想制作一个堆叠的条形图,也就是说,有两个变量(例如,导入的案例编号和自动案例编号),根据你的说法,我该如何编码:dataset % group_by_(input$Time_unit) %>% summarise(Sum1 = sum(Imported_Cases), Sum2=sum(Autochtonous_Cases ) ?谢谢你的提前。
  • 是的,您应该完全按照您的编写方式进行操作,但是要创建堆积条形图,您必须在计算“总和”后“融化”数据,并创建变量用作“ggplot”中的填充参数
  • @马尔维娜_a。伟大的 !感谢您的帮助。
  • 嗨@Pascal 我认为如果您对melt 函数有疑问,您应该问一个新问题
  • 嗨 Malvina_a,好的,谢谢,我将在论坛上发布一个带有“melt”功能的新问题。我准备好了。
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 2016-07-28
  • 2018-08-19
  • 1970-01-01
  • 2014-10-27
相关资源
最近更新 更多