2011-06-14 99 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