问题描述
||
我需要用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)