闪亮的Barplot显示1条太少和奇怪的瘦线

时间:2017-01-03 00:00:39

标签: r plot shiny shiny-server

我使用从csv文件中读取的数据创建了一个条形图。

最初创建了一个过滤函数,用于过滤来自RGui的数据并将其应用于barplot()中。 它能够过滤掉数据列表并显示预期的5个柱。

在闪亮的(多次代码更改)中添加相同的条形图,条形图总是会显示少一个条形图,并且还会在非常细的条形图中显示其余数据。

(见下图)

Server.R

slt <- read.csv("data/slt_inc.csv")
#extract only the number column
slt_vec <- c(slt$num_of_inc)
#extract only the date column
slt_date <- c(slt$date)

output$incidentPlot <- renderPlot({barplot(slt_vec, names.arg=slt$date, main="SLT Incidents", xlab="Date", ylab="# of Incidents", col="green", as.Date(slt_date, origin="2016-10-24") >= input$dateRange[1] & as.Date(slt_date, origin="2016-10-24") <= input$dateRange[2])})

ui.R

dateRangeInput("dateRange", "Date Selection: ", start="2016-10-24", end=NULL, format="yyyy-mm-dd", min="2016-10-24", language = "en", width="100%"),
fluidRow(column(6, verbatimTextOutput("date"))),

有关如何解决此问题的任何想法?

另一个可能相关的问题。

使用另一个日期范围12月28日 - 12月30日

CSV文件数据

  • 2016年12月28日,星期三,2
  • 2016年12月29日,星期四,1
  • 二〇一六年十二月三十零日,星期五,1

它应显示至少2个条形或预期3条,但一旦我在12月28日到12月30日过滤,则不会显示任何内容。

enter image description here

1 个答案:

答案 0 :(得分:2)

好的,有两件事。首先,有趣的瘦线是因为您打算用来对数据进行子集化的逻辑向量实际上被解释为barwidths(第二个未命名的参数)。例如,此barplot函数调用:

barplot( c(5,4,6,3,1,2,4), c(T,T,F,F,F,F,F) )

获取此图:

enter image description here

有关详细信息,请参阅?barplot

其次,我伪造了你的数据并整理了一个小例子,告诉你我将如何处理这个任务:

library(shiny)

u <- shinyUI(fluidPage(fluidRow(
      dateRangeInput("dateRange","Date Selection: ",
                      start = "2016-10-24",end = NULL,
                     format = "yyyy-mm-dd",min = "2016-10-24",
                     language = "en",width = "100%"),
      fluidRow(column(6,verbatimTextOutput("date"))),
      plotOutput('incidentPlot')  
)))

s <- shinyServer(function(input,output) {

  # fake up the data
  dd1 <- c(24,25,26,28,28)
  sltval1 <- c(5,1,6,7,2)
  dayval1 <- as.Date(sprintf("2016-10-%2.2d",dd1))   
  dd2 <- c(7,8,9,12,13,14,15,16,19,20,21,22,23,26,27,28,29,30)
  sltval2 <- c(6,5,1,3,6,6,1,2,3,6,4,1,0,0,1,2,1,1)
  dayval2 <- as.Date(sprintf("2016-12-%2.2d",dd2))
  slt <- data.frame(date = c(dayval1,dayval2),num_of_inc = c(sltval1,sltval2))
  slt$dow <- weekdays(slt$date)
  # end of data fakery

  output$date <- renderPrint({ print(input$dateRange) })

  output$incidentPlot <- renderPlot({
    dmin <- as.Date(input$dateRange[1])
    dmax <- as.Date(input$dateRange[2])
    bdf <- slt[ dmin<= slt$date & slt$date <= dmax, ]
    barplot(bdf$num_of_inc,names.arg = bdf$date, col = "green",
            main="SLT Incidents",xlab="Date",ylab="# of Incidents")
    })
})
shinyApp(ui = u,server = s)

enter image description here

最后,如果要轻松编写有效的R代码,您可能需要更多地了解如何使用和子集数据帧和向量。 R的数据处理和子集化方法与其他语言不同,期望您可以在不进行一些研究的情况下进行数据处理。

例如,我建议您至少仔细阅读一些在线书籍Advanced-R,尤其是关于数据结构和子集的两个开头章节 - 或类似的东西。