R:使用ggplot2绘制具有分位数的时间序列

问题描述

|| 我需要用ggplot2绘制时间序列。对于时间序列的每个点,我也有一些分位数,例如0.05、0.25、0.75、0.95,即每个点有五个数据。例如:
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!     

解决方法

        这是您想要的吗?
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\",\"red\"))
给你: 再次阅读您的问题后,也许您想要中位数估计值之外的阴影色带而不是线条?如果是这样,请旋转一下。唯一真正的窍门是,我们将
group = 1
作为美学因素传递给
geom_line()
,使其在因子/字符数据中表现正常。以前,我们按作用相同的变量分组。还要注意,我们不再使用“ 8”格式的data.frame,因为在这种情况下,宽的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\")) 
编辑:将图例强制为预测值 我们可以使用与
geom_ribbon()
层相同的方法。我们将美学添加到
geom_line()
,然后将其值设置为
scale_colour_manual()
ggplot(dat,alpha = .25) +
  geom_line(aes(y = quantile.0.5,colour = \"Predicted\")) +
  scale_fill_manual(name = \"\",\"05%-95%\" = \"blue\")) +
  scale_colour_manual(name = \"\",values = c(\"Predicted\" = \"black\"))
可能有更有效的方法来执行此操作,但这是我一直使用的方法,并取得了很好的成功。 YMMV。     ,        假设您的dat.frame称为
df
: 最简单的“ 1”解决方案是使用箱线图几何。这给出了一条黑色的中心线,中间和较高位置带有填充框。 由于您已经预先汇总了数据,因此指定
stat=\"identity\"
参数很重要:
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\"
)
PS。我重新创建了您的数据,如下所示:
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)