首页 > 解决方案 > 如何填充ggplot图中两条曲线之间的间隙

问题描述

我想对数据拟合一个简单的三次多项式,然后用三种不同的几何图形构建一个图:我拟合模型的数据点集(geom_point蓝色),对这些点的拟合+预测区间(geom_line,也蓝色)和模型拟合后几天的预测(geom_line,红色)。这是我的代码:

library(ggplot2)

positives <- c(13, 65, 118, 229, 322, 455, 655, 888, 1128, 1577)
days_passed <- length(positives)
t <- seq(1, days_passed)
t_full <- c(t, seq(t[days_passed], 30))

model <- lm(positives ~ poly(t,degree=3))

predict_positives <- predict(model, list(t = t_full), interval = "prediction")

# plot
length(positives) <- length(t_full)
dframe <- data.frame(day = t_full, 
                     positives = positives,
                     future = ifelse(t_full <= days_passed, "N", "Y"),
                     lwr = predict_positives[, "lwr"],
                     fit = predict_positives[, "fit"],
                     upr = predict_positives[, "upr"])
p <- ggplot(dframe, aes(x = day, y = positives, color = future)) +
  geom_point() +
  geom_line(aes(y = fit)) +
  geom_line(aes(y = lwr), linetype = "dashed") +
  geom_line(aes(y = upr), linetype = "dashed") +
  geom_vline(xintercept = 17, linetype = "dashed") + 
  geom_vline(xintercept = 24)

print(p)

然而,结果图显示了一个不美观的差距:

在此处输入图像描述

如何修改我的代码以使拟合和预测是连续的?

标签: rggplot2

解决方案


您的future列具有N对应于第 10 天的两行的值。如果您只是更改它,该图将显示您的意图。

dframe$future[11] <- "Y"

ggplot(dframe, aes(x = day, y = positives, color = future)) +
  geom_point() +
  geom_line(aes(y = fit)) +
  geom_line(aes(y = lwr), linetype = "dashed") +
  geom_line(aes(y = upr), linetype = "dashed") +
  geom_vline(xintercept = 17, linetype = "dashed") + 
  geom_vline(xintercept = 24)

在此处输入图像描述


推荐阅读