添加显示平均值和四分位数范围的色带到ggplot2

Hed*_*hog 5 r ggplot2

我使用以下示例数据和代码

# Example
x1<- as.Date("2013-12-31")
adddate1 <- 1:60
dts <- x1 + adddate1

df <- data.frame(a=runif(100),b=runif(100),c=runif(100) ,d=rnorm(2700), dates=dts)
df$Metric <- ifelse(df$a > 0.5,"a", "b")

df$Methodology <- ifelse(df$a > 0.5,"One", "Two")
df$Methodology <- factor(df$Methodology)

pl<-df %>%
  group_by(Methodology) %>%
  do(
    plots = ggplot(data=., aes(x = dates, y = b)) +
              geom_point() +
              stat_smooth(method="auto",size=1.5) +
              stat_summary(fun.data=median_hilow, fun.args=(conf.int=1)) + # Show IQR
              scale_x_date(date_breaks = "1 week", date_labels =  "%d-%b-%y") +
              facet_wrap(~Metric, scales="free") +
              ggtitle(unique(.$Methodology)) 
    )
pl[[1,2]]
Run Code Online (Sandbox Code Playgroud)

我看到的输出是:

在此输入图像描述

但是,我希望看到IQR,如通过stat_summary一些此类例程计算的,显示为带状图,以及显示中值的线.

我怀疑我必须编写用户定义的函数并使用它.

感谢任何提示或提示.

ali*_*ire 7

你可以用stat_summarygeom_smooth(或反之,如果你喜欢):

library(ggplot2)
set.seed(47)

df <- data.frame(a = runif(100), 
                 b = runif(100), 
                 c = runif(100), 
                 d = rnorm(2700), 
                 dates = as.Date("2013-12-31") + 1:60)
df$Metric <- ifelse(df$a > 0.5, "a", "b")
df$Methodology <- factor(ifelse(df$a > 0.5, "One", "Two"))


ggplot(df, aes(x = dates, y = b)) +
    geom_point() +
    stat_smooth(size = 1.5) +
    geom_smooth(stat = 'summary', alpha = 0.2, fill = 'red', color = 'red',
                fun.data = median_hilow, fun.args = list(conf.int = 1)) + 
    scale_x_date(date_breaks = "1 week", date_labels =  "%d-%b-%y") +
    facet_wrap(~ Methodology + Metric, ncol = 1)
#> `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Run Code Online (Sandbox Code Playgroud)

因为conf.int = 1,这会在每个x值的最小值和最大值之间绘制一条带,中间值为线.如果您确实要绘制第25和第75百分位数,请设置conf.int = 0.5.根据这些数据,在每个x值上没有足够的观察值看起来非常不同,所以在一些新的样本数据上,

library(ggplot2)
set.seed(47)

ggplot(tibble::tibble(x = rep(seq(0, 4*pi, length.out = 50), 50), 
                      y = rnorm(2500) * sin(x) + sin(x)), 
       aes(x, y)) + 
    geom_point(alpha = 0.1) + 
    geom_smooth(fill = 'darkblue') + 
    geom_smooth(stat = 'summary', color = 'red', fill = 'red', alpha = 0.2, 
                fun.data = median_hilow, fun.args = list(conf.int = 0.5))
#> `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Run Code Online (Sandbox Code Playgroud)

median_hilow(真Hmisc::smedian.hilow)不允许你设定位数的类型,虽然如此,对于更精确的控制,重写功能(返回一个类似结构数据帧)或通过单独的函数对每个统计到fun.y,fun.yminfun.ymax参数.

  • @ J.Con这些点是每个日期的b值。红线连接每个日期的b值中位数。红丝带是这些中位数周围的置信区间,但是由于conf.int设置为1,因此它实际上只是连接了最大值和最小值。蓝线是`mgcv :: gam(b〜s(dates))`的平滑样条回归模型,灰带是其置信区间。 (2认同)