2017-01-03 9 views
1

나는 csv 파일에서 읽은 데이터를 사용하여 막대 그래프를 만들었습니다.반짝이는 Barplot이 1 바가 너무 적고 이상한 마른 선들을 보입니다

처음에는 RGui에서 데이터를 필터링하고 barplot()에 적용하는 필터 함수를 만들었습니다. 데이터 목록을 필터링 할 수 있었으며 예상되는 5 개의 막대가 표시되었습니다.

빛나는 (여러 코드가 변경됨) 동일한 바지를 추가하면 막대 그래프는 항상 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"))), 

어떤 아이디어, (아래 이미지 참조)?

다른 관련이있을 수 있습니다. 다른 기간 십이 28 사용

- 십이 30

CSV 파일 데이터

  • 2016년 12월 28일, 수요일, 2
  • 2016년 12월 29일, 목요일, 1
  • 2016-12-30, 금요일, 1

적어도 2 개의 막대가 표시되거나 3이되어야하지만 12 월 28 일부터 12 월 30 일까지는 필터가 표시되지 않습니다.

enter image description here

+0

'origin' 문을 삭제하십시오. 그들은 당신이 생각하는 것을 의미하지는 않습니다. 또한 데이터 프레임의 날짜를 필터링 한 다음 나중에 플로팅 할 열을 추출하십시오. 쉽습니다. 또한'c (..)'는 불필요하므로'c (..)'구조는 그렇게 쓰이지 않습니다. –

+0

그것은 플롯 이미지에서 흥미로운 버그이지만, 나는 너무 졸려서 그것을 추적하고 정확히 그 일이 일어난 이유를 알아 냈습니다. –

+0

처음에는 as.Date()에 "origin"매개 변수가 없었습니다. "원본을 제공해야합니다."라는 오류 메시지가 표시됩니다. "원본"을 추가하면 작동하기 시작합니다. 데이터 프레임에 날짜 필터링을 적용 해 보겠습니다. C (...)에 대해서는 대신 열 이름을 사용하는 것이 더 나은 방법이라고 생각하겠습니까? 그래서이 경우 slt $ num_of_inc와 같을 것입니다. 나 맞아? 다시 한 번 감사드립니다. – blitz

답변

2

두 가지. 먼저 데이터를 서브 세트하기 위해 사용하려는 논리 벡터가 실제로 barwidth (두 번째 이름이 지정되지 않은 매개 변수)로 해석되기 때문에 재미있는 스키니 라인이 있습니다. 예를 들어이 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 중 일부, 특히 데이터 구조 및 하위 집합의 두 장을 읽는 것이 좋습니다.

+0

효과가있는 것처럼 보입니다. 내 코드를 수정해야 할 것입니다. 도와 주셔서 감사합니다. 현재 R에 대해 더 많이 배웁니다. – blitz