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

标签 r ggplot2 time-series

我需要用 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了。

任何帮助,将不胜感激。

致敬!

最佳答案

这是你想要的吗? 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()将正确处理因子/字符数据。以前,我们按具有相同效果的变量分组。另请注意,我们不再使用 melt ed 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")) 

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"))

可能有更有效的方法来做到这一点,但这是我一直使用的方式,并取得了相当大的成功。天啊。

关于R:使用 ggplot2 绘制带有分位数的时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6340485/

相关文章:

r - 将向量绘制为条形图

r - 使用 autoplot 和 ggplot 更改每个时间序列的线型/宽度

r - 使用 R 通过 SSL 连接到 Postgres

r - glm eval 中的错误(family$initialize): y values must be 0 <= y <= 1 BUT values ARE 0 and 1

r - 合并两个数据框,坐标为 r

datetime - 从频率 = 23 的不规则 (as.Date) 时间序列创建规则时间序列

Python:使用 Pandas 创建多列系列

r - 如何用第二个表 R 中的值替换变量?

r - 如何在 R 中的 ggsurvplot/survminer 的 x 轴上添加特定值?

python - 如何平滑时间序列的频谱?