2017-02-13 46 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

這似乎罰款。很明顯,某一天有多少降雨。然而,也可以解釋爲,在一天的中午和下一天的中午之間,有一定的降雨量下降,這是錯誤的。如果該圖與同一時期的其他相關連續變量圖組合在一起,則這尤其是個問題。

爲了避開這個問題,我可以用geom_step如下:

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

其中給出:

enter image description here

這是顯示的數據有更好的方式,現在scale_x_date出現是一個連續的軸。但是,如果將這個區域填充到所填入的步驟以下,這將是一件好事,但似乎找不到這樣做的簡單方法。

問題1:如何填充geom_step?可能嗎?

它也可以是到Date轉換成POSIXct便於相同x軸在多情節的數字如在本討論SO question here有用。 我能做到這一點,如下所示:

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(Date) - 3600' .. – timat

+0

@ArtemSokolov我已經看到了,但無法真正找出答案。也想看看最近有沒有變化。謝謝 –

回答

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) 

(注新創建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  

您現在可以使用聯合矩陣「補」你的步驟:

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之前投下你Date載體characteras.POSIXct(as.character(Date)),但這將完全離開關閉的時間,這可能是無論如何你想要什麼。

+0

感謝您的經歷。看看上面的'geom_bar'解決方案,你有什麼想法,爲什麼我不能指定'width'參數與'scale_x_datetime'結合使用? –

+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:00。當使用相同的x-aixs對齊多個圖時,這使我更容易。然而,'geom_bar'似乎沒有接受帶'scale_x_datetime'的'width'參數... –

+0

'width = 1'看起來更好 –

+0

我不喜歡'width = 1'的樣子。輕微的分區是乾淨的,並顯示清晰的黎明。但是你有現在需要的工具 –