繁体   English   中英

在 ggplot2 中,指定用于 geom_smooth() 置信区间的值(类似于 geom_errorbar)

[英]In ggplot2,specify values to use for geom_smooth() confidence interval (similar to geom_errorbar)

我正在使用geom_smooth()绘制一年中的温度值。 我有每天的最低、最高和平均温度,我想将平均值显示为一条线,然后像你一样显示一个置信区间的最小值和最大值。 geom_smooth()有一个se = T参数,我想知道如何提供变量以用作“置信区间”。 我知道你可以用geom_errorbar()的箱形图来做到这一点,我希望有一个类似的线图版本。

我希望我的情节看起来像这样的结果,但使用最大值和最小值来显示置信区间。

mean <- runif(365, min = 10, max = 25)
max <- runif(365, min = 26, max = 35)
min <- runif(365, min = 0, max = 9)

temp <- data.frame(day = 1:365, mean = mean)

ggplot(data = temp, aes(x = day, y = mean)) +
  geom_smooth()

编辑:我正在添加两年的数据,并且希望每年都有自己的 geom_smooth 线和自己的 geom_ribbon。 就像现在的代码一样,每年都有自己的 geom_smooth 线,但所有年份都有一个 geom_ribbon。


mean1 <- runif(365, min = 10, max = 25)
max1 <- runif(365, min = 26, max = 35)
min1 <- runif(365, min = 0, max = 9)

mean3 <- runif(365, min = 10, max = 25)
max3 <- runif(365, min = 30, max = 40)
min3 <- runif(365, min = -5, max = 5)

mean2 <- runif(365, min = 10, max = 25)
max2 <- runif(365, min = 200, max = 220)
min2 <- runif(365, min = -10, max = 9)

temp <- rbind(data.frame(day = 1:365, mean = mean1, max = max1, min = min1, label = 'A'),
            data.frame(day = 1:365, mean = mean2, max = max2, min = min2, label = 'B'),
            data.frame(day = 1:365, mean = mean3, max = max3, min = min3, label = 'C'))


ggplot(data = temp, aes(x = day, y = mean, color = label)) +
  geom_ribbon(data = temp %>% group_by(label),
              aes(ymin = stats::predict(loess(min ~ day)), ymax = stats::predict(loess(max ~ day)),
                  color = label),
              alpha = 0.1) +
  geom_smooth(se = F) 

谢谢!

编辑#2:平滑色带见底部。 采用自https://stackoverflow.com/a/71423425/6851825

编辑:下面的第二个选项直接使用min / max来定义阴影范围。

我们可以通过将置信区间放入使用stat_smooth计算的功能区层中来指定一个固定的置信区间,但是我们覆盖 y 范围以使用平滑值加上一个常数。

ggplot(data = temp, aes(x = day, y = mean)) +
  stat_smooth(
    geom="ribbon",
    aes(ymax = after_stat(y) + 1,
        ymin = after_stat(y) - 1),
    alpha = 0.1
  ) +
  geom_smooth(se = FALSE)

在此处输入图像描述

如果你的意思是你想直接使用最小值和最大值作为你的阴影范围:

ggplot(data = temp, aes(x = day, y = mean)) +
  geom_ribbon(aes(ymin = min, ymax = max),
              alpha = 0.1) +
  geom_smooth(se = FALSE)

在此处输入图像描述


采用https://stackoverflow.com/a/71423425/6851825 ,我们可以将最小值和最大值放入数据框中,并制作一个调用predict(loess(y~x))的功能区来计算最小值和最大值范围。

temp <- data.frame(day = 1:365, mean = mean,
                   max = max, min = min)

ggplot(data = temp, aes(x = day)) +
  geom_ribbon(alpha = 0.1,
              aes(ymin = predict(loess(min~day)),
                  ymax = predict(loess(max~day)))) +
  geom_smooth(aes(y = mean), se = FALSE) +
  
  # these are to confirm the ranges match what geom_smooth would produce
  geom_smooth(aes(y = max), se = FALSE, linetype = "dashed", size = 0.2) +
  geom_smooth(aes(y = min), se = FALSE, linetype = "dashed", size = 0.2)

在此处输入图像描述


根据新的分组数据编辑:

先前的技术不适用于分组数据,因为基本predict函数不会“看到”组,除非我们将它放在dplyr::group_bydplyr::mutate中。 所以我们可以使用这些来预先计算我们在data =部分中需要的值。

ggplot(data = temp, aes(x = day, y = mean, color = label)) +
  geom_ribbon(data = temp %>% group_by(label) %>%
                mutate(ymin_smooth = stats::predict(loess(min~day)),
                       ymax_smooth = stats::predict(loess(max~day))),
              aes(ymin = ymin_smooth,  ymax = ymax_smooth, fill = label),
              alpha = 0.1) +
  geom_smooth(se = F) 

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM