2011-06-14 128 views
8

我需要用ggplot2繪製時間序列。對於時間序列的每個點,我也有一些分位數,比如0.05,0.25,0.75,0.95,即每個點有五個數據。例如:R:用ggplot2繪製帶分位數的時間序列

time   quantile=0.05 quantile=0.25 quantile=0.5 quantile=0.75 quantile=0.95 
00:01   623.0725  630.4353  903.8870  959.1407  1327.721 
00:02   623.0944  631.3707  911.9967  1337.4564  1518.539 
00:03   623.0725  630.4353  903.8870  1170.8316  1431.893 
00:04   623.0725  630.4353  903.8870  1336.3212  1431.893 
00:05   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:06   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:07   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:08   623.0780  631.3483  905.3496  1056.3719  1375.610 
00:09   623.0671  630.4275  903.8839  1170.8196  1356.963 
00:10   623.0507  630.0261  741.8475  1006.1208  1462.271 

理想情況下,我想具有0.5分位數爲黑線,其他爲圍繞黑線陰影顏色的間隔。什麼是最好的方法來做到這一點?我一直在四處尋找,我找不到這樣的例子,甚至更少使用ggplot2。

任何幫助,將不勝感激。

Salud!

+2

給我們一些數據來玩。這裏有一些關於如何製作一個很好的可重複的例子的指導:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – 2011-06-14 09:28:32

回答

9

這是做你想做的嗎? ggplot的訣竅是瞭解它需要長格式的數據。這通常意味着我們必須在數據準備好繪製之前轉換數據,通常使用melt()

textConnection()讀取數據,並創建一個對象命名dat,以後這裏是步驟,你會帶:

#Melt into long format 
dat.m <- melt(dat, id.vars = "time") 

#Not necessary, but if you want different line types depending on quantile, here's how I'd do it 
dat.m <- within(dat.m 
    , lty <- ifelse(variable == "quantile.0.5", 1 
    , ifelse(variable %in% c("quantile.0.25", "quantile.0.75"),2,3) 
    ) 
) 

#plot it 
ggplot(dat.m, aes(time, value, group = variable, colour = variable, linetype = lty)) + 
    geom_line() + 
    scale_colour_manual(name = "", values = c("red", "blue", "black", "blue", "red")) 

爲您提供:

enter image description here

閱讀您的問題後,再次,也許你想在中值估計之外而不是線條陰影的色帶?如果是這樣,給這個旋轉。這裏唯一真正的訣竅是我們通過group = 1作爲美學,以便geom_line()將因素/字符數據正確行爲。以前,我們通過服務於相同效果的變量進行分組。另請注意,我們不再使用數據框架,因爲在這種情況下,寬泛的data.frame適合我們。

ggplot(dat, aes(x = time, group = 1)) + 
    geom_ribbon(aes(ymin = quantile.0.05, ymax = quantile.0.95, fill = "05%-95%"), alpha = .25) + 
    geom_ribbon(aes(ymin = quantile.0.25, ymax = quantile.0.75, fill = "25%-75%"), alpha = .25) + 
    geom_line(aes(y = quantile.0.5)) + 
    scale_fill_manual(name = "", values = c("25%-75%" = "red", "05%-95%" = "blue")) 

enter image description here

編輯:要強制一個傳奇的預測值

我們可以使用用於geom_ribbon()層相同的方法。我們將添加一個審美geom_line()然後設置審美價值與scale_colour_manual()

ggplot(dat, aes(x = time, group = 1)) + 
    geom_ribbon(aes(ymin = quantile.0.05, ymax = quantile.0.95, fill = "05%-95%"), alpha = .25) + 
    geom_ribbon(aes(ymin = quantile.0.25, ymax = quantile.0.75, fill = "25%-75%"), alpha = .25) + 
    geom_line(aes(y = quantile.0.5, colour = "Predicted")) + 
    scale_fill_manual(name = "", values = c("25%-75%" = "red", "05%-95%" = "blue")) + 
    scale_colour_manual(name = "", values = c("Predicted" = "black")) 

可能有更有效的方式來做到這一點,但是這是我一直使用,並且有不錯的方式與它成功。因人而異。

+0

ggplot答案就像倫敦巴士。你可以等三個小時,沒有任何可見的,然後突然間你有兩個6分鐘! PS。 +1 – Andrie 2011-06-14 11:23:24

+0

聽起來像幾年前在盧布爾雅那的巴士。 :) – 2011-06-14 12:58:34

+0

哇,這只是完美的!非常感謝你!我需要添加的唯一東西是一個讀取「預測值」的行的圖例。我怎麼能這樣做?我可以將scale_fill_manual與其他scale_manual結合使用嗎?再次感謝! – jla 2011-06-14 17:27:48

5

假設你dat.frame被稱爲df

最簡單的ggplot解決方案是使用箱線圖GEOM。這給了一個黑色的中線,填補了中間和上部的框。

ggplot(df, aes(x=time)) + 
    geom_boxplot(
     aes(
      lower=quantile.0.25, 
      upper=quantile.0.75, 
      middle=quantile.0.5, 
      ymin=quantile.0.05, 
      ymax=quantile.0.95 
     ), 
     stat="identity", 
     fill = "cyan" 
) 

enter image description here

PS:

既然你已經預先彙總數據,它指定stat="identity"參數是非常重要的。我重新創建您的數據如下:

df <- "time   quantile=0.05 quantile=0.25 quantile=0.5 quantile=0.75 quantile=0.95 
00:01   623.0725  630.4353  903.8870  959.1407  1327.721 
00:02   623.0944  631.3707  911.9967  1337.4564  1518.539 
00:03   623.0725  630.4353  903.8870  1170.8316  1431.893 
00:04   623.0725  630.4353  903.8870  1336.3212  1431.893 
00:05   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:06   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:07   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:08   623.0780  631.3483  905.3496  1056.3719  1375.610 
00:09   623.0671  630.4275  903.8839  1170.8196  1356.963 
00:10   623.0507  630.0261  741.8475  1006.1208  1462.271" 

df <- read.table(textConnection(df), header=TRUE) 
+0

嗯 - 我們已經解釋了他的問題不同......重新閱讀後,我不確定誰在這裏正確的道路上!無論如何,展示如何手動創建箱型圖的工作很好。 +1 – Chase 2011-06-14 11:20:20

+0

是的,我對線條和緞帶風格更感興趣,因爲我的系列很長。但是,無論如何,我還是學到了更多東西! :) – jla 2011-06-14 17:30:46