2017-02-13 1 views
0

일별 합계를 계산하여 연속적으로 수집되는 일부 강수량 데이터가 있습니다. 다음과 같이geom_step을 사용하여 일일 강우량 데이터 플로팅

Date <- c(seq(as.Date("2016-07-01"), by = "1 day", length.out = 10)) 
rain_mm <- c(3,6,8,12,0,0,34,23,5,1) 
rain_data <- data.frame(Date, rain_mm) 

내가이 데이터를 플롯 할 수 있습니다 :

ggplot(rain_data, aes(Date, rain_mm)) + 
    geom_bar(stat = "identity") + 
    scale_x_date(date_labels = "%d") 

다음을 제공합니다 :

enter image description here

이 잘 보이는 몇 가지 장난감 데이터입니다. 특정 날에 얼마나 많은 강우량이 있었는지는 분명합니다. 그러나 하루의 정오와 다음 정오 사이에는 일정한 양의 비가 내렸다고 해석 할 수 있습니다. 이는 잘못된 것입니다. 같은 기간에 그래프가 관련 연속 변수의 다른 플롯과 결합되는 경우 특히 문제가됩니다.

library(ggplot) 
ggplot(rain_data, aes(Date, rain_mm)) + 
    geom_step() + 
    scale_x_date(date_labels = "%d") 

주는 :

enter image description here

이 데이터를 표시하는 더 좋은 방법이며, 지금 scale_x_date가 나타납니다

다음과 같이 내가 geom_step를 사용할 수있는이 문제를 피해 갈하려면 연속 축이다. 그러나, 채워진 단계 아래의 영역을 얻는 것이 좋을 것이지만, 이것을하지 않는 직접적인 방법을 찾는 것 같습니다.

1 : 어떻게 geom_step 아래에 기입합니까? 가능한가?

또한이 SO question here에서 설명한 바와 같이 멀티 플롯 도면에서 동일한 X 축을 용이 POSIXctDate으로 변환하는 것이 유용 할 수있다. 다음과 같이 나는이 작업을 수행 할 수 있습니다

library(dplyr) 
rain_data_POSIX <- rain_data %>% mutate(Date = as.POSIXct(Date)) 

        Date rain_mm 
1 2016-07-01 01:00:00  3 
2 2016-07-02 01:00:00  6 
3 2016-07-03 01:00:00  8 
4 2016-07-04 01:00:00  12 
5 2016-07-05 01:00:00  0 
6 2016-07-06 01:00:00  0 
7 2016-07-07 01:00:00  34 
8 2016-07-08 01:00:00  23 
9 2016-07-09 01:00:00  5 
10 2016-07-10 01:00:00  1 

그러나, 이것은 각각의 날짜 01:00 시간을 제공합니다. 차라리 00:00 있습니다. as.POSIXct 함수 호출에서이를 변경할 수 있습니까, 아니면 나중에 별도의 함수를 사용하여 수행해야합니까? 나는 그것이 tz = ""와 관련이 있다고 생각하지만 그럴 수 없다.

Date에서 POSIXct으로 어떻게 변환하여 생성 시간이 00:00이 될 수 있습니까?

감사

+0

첫 번째 질문은 잠재적 중복의이다 : http://stackoverflow.com/questions/21887088/generate-a-filled-geom-step

나는 좋은 결과 발견 –

+0

seconde 질문 :''TZ = "GMT"를 시도하거나 1시간 제거 :'as.POSIXct (날짜) - 3600' .. 나는 그것을 보았지만 정말 답을 알아낼 수 – timat

+0

@ArtemSokolov. 최근에 어떤 것이 바뀌 었는지보고 싶었습니다. 'TZ = "GMT"@timat 감사 –

답변

2

첫 번째 질문의 경우, this example을 작업 할 수 있습니다.

rain_tl <- mutate(rain_data, rain_mm = lag(rain_mm)) 

그런 다음 원본 데이터와이 시간이 느껴지 버전을 결합하고, 날짜별로 다시 분류 :

rain_all <- bind_rows(old = rain_data, new = rain_tl, .id="source") %>% 
    arrange(Date, source) 

(새로 생성을 참고 첫째, 데이터의 시간 느껴지 버전을 만들

> head(rain_all) 
    source  Date rain_mm 
1 new 2016-07-01  NA 
2 old 2016-07-01  3 
3 new 2016-07-02  3 
4 old 2016-07-02  6 
5 new 2016-07-03  6 
6 old 2016-07-03  8  

이제 당신의 단계를 "입력"을 공동 매트릭스를 사용할 수 있습니다 : source 열은 제대로 시간 느껴지 버전으로 원래의 데이터)를 인터레이스, 관계를 파괴하는 데 사용됩니다

ggplot(rain_data, aes(Date, rain_mm)) + 
    geom_step() + 
    geom_ribbon(data = rain_all, aes(ymin = 0, ymax = rain_mm), 
      fill="tomato", alpha=0.5): 

이 다음 플롯을 생성 : 두 번째 질문에 대한

enter image description here


이 문제가 as.POSIX.ct does not pass additional arguments to the converter, 그래서 tz 인수는 아무것도하지 않습니다 지정.

1) 당신이 원하는 출력을 다시 포맷 : format(as.POSIXct(Date), "%F 00:00") 입력 character의 벡터를 반환

당신은 기본적으로 두 가지 옵션이 있습니다. 당신이 ... POSIXct로 대신 할 수있는 객체 유형을 유지하려면

2) 이전 as.POSIX.ct에 전달에 characterDate 벡터 캐스트 : as.POSIXct(as.character(Date)), 그러나 이것은 어떤 일 수도, 완전히 시간을 떠날 것이다 어쨌든 당신이 원하는 것.

+0

감사합니다. 위의'geom_bar' 솔루션을 찾고, 당신에게'scale_x_datetime'와 함께 사용할 때 나는'width' 인수를 지정하지 못할 이유는 어떤 생각을합니까? –

+0

귀하의 질문 (들) 문제에 너무 전문지고있다 (예를 들어, 원래 질문은'scale_x_date'를 사용하고 scale_x_datetime''전혀 언급하지 않음). 문제를 논리적 덩어리로 나누고 각 청크를 일반 대중이 관심을 가질만한 특정 문제를 해결하는 별도의 스택 오버플로 질문으로 제시하십시오. –

1

당신이 해킹을 방지하려는 경우, 당신은 geom_bar 표현의 위치를 ​​사용자 정의 할 수 있습니다.

ggplot(rain_data, aes(Date, rain_mm)) + 
    geom_bar(stat = "identity", position = position_nudge(x = 0.51), width = 0.99) + 
    scale_x_date(date_labels = "%d") 

enter image description here

+0

덕분에, 나는'Date'를'POSIXct'로 변환하고 시간을 12 시로 설정함으로써 같은 줄을 생각하고있었습니다. 같은 X 축 모델로 여러 플롯을 정렬 할 때 나를 위해 쉽게 만든다.그러나'geom_bar'는'scale_x_datetime'과 함께'width' 인수를 받아들이지 않습니다 ... –

+0

또한'width = 1'로 더보기가 좋습니다. –

+0

'width = 1'이 맘에 들지 않았습니다. 약간의 칸막이는 깨끗하고 맑은 새벽을 보여준다. 하지만 지금 필요한 도구가 있습니다. –

관련 문제