Shiny 中的条形图显示 1 条太少和奇怪的细线
Barplot in Shiny is showing 1 bar too few and strange skinny lines
我使用从 csv 文件读取的数据创建了一个条形图。
最初创建了一个过滤函数来过滤来自 RGui 的数据,并将其应用于 barplot()。
它能够筛选出数据列表并显示预期的 5 个柱。
在 shiny 中添加相同的条形图(几个代码更改),条形图将始终显示少 1 个条形,并且还会以非常细的条形显示其余数据。
(见下图)
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
- 2016-12-30,星期五,1
它应该至少显示 2 个条或预期的 3 个,但是一旦我过滤了 12 月 28 日到 12 月 30 日,就什么也没有显示。
好的,有两件事。首先,有趣的细线是因为您打算用于对数据进行子集化的逻辑向量实际上被解释为条宽(第二个未命名参数)。例如这个 barplot
函数调用:
barplot( c(5,4,6,3,1,2,4), c(T,T,F,F,F,F,F) )
得到这个情节:
有关详细信息,请参阅 ?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)
最后,如果要轻松编写有效的 R 代码,您可能需要更多地了解如何使用数据帧和向量并对其进行子集化。 R 的数据操作和子集化方法与其他语言太不一样了,你不需稍作研究就可以掌握它。
例如,我建议至少仔细阅读一些在线书籍 Advanced-R,尤其是关于数据结构和子集的两个开头章节 - 或者类似的内容。
我使用从 csv 文件读取的数据创建了一个条形图。
最初创建了一个过滤函数来过滤来自 RGui 的数据,并将其应用于 barplot()。 它能够筛选出数据列表并显示预期的 5 个柱。
在 shiny 中添加相同的条形图(几个代码更改),条形图将始终显示少 1 个条形,并且还会以非常细的条形显示其余数据。
(见下图)
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
- 2016-12-30,星期五,1
它应该至少显示 2 个条或预期的 3 个,但是一旦我过滤了 12 月 28 日到 12 月 30 日,就什么也没有显示。
好的,有两件事。首先,有趣的细线是因为您打算用于对数据进行子集化的逻辑向量实际上被解释为条宽(第二个未命名参数)。例如这个 barplot
函数调用:
barplot( c(5,4,6,3,1,2,4), c(T,T,F,F,F,F,F) )
得到这个情节:
有关详细信息,请参阅 ?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)
最后,如果要轻松编写有效的 R 代码,您可能需要更多地了解如何使用数据帧和向量并对其进行子集化。 R 的数据操作和子集化方法与其他语言太不一样了,你不需稍作研究就可以掌握它。
例如,我建议至少仔细阅读一些在线书籍 Advanced-R,尤其是关于数据结构和子集的两个开头章节 - 或者类似的内容。