代码之家  ›  专栏  ›  技术社区  ›  Hedgehog

将显示平均值和四分位间距的功能区添加到ggplot2

  •  8
  • Hedgehog  · 技术社区  · 8 年前

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

    # 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]]
    

    我看到的输出是:

    enter image description here

    然而,我希望看到IQR,由 stat_summary 或者一些这样的例程,显示为带状图,以及显示中值的线。

    我怀疑我将不得不编写一个用户定义的函数并使用它。

    感谢任何提示或提示。

    2 回复  |  直到 8 年前
        1
  •  9
  •   alistaire    7 年前

    您可以使用 stat_summary 具有 geom_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")'
    

    自从 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")'
    

    median_hilow (真的 Hmisc::smedian.hilow )但是,不允许设置分位数的类型,因此为了进行更精确的控制,请重写函数(返回结构类似的数据帧)或将每个统计信息的单独函数传递给 fun.y , fun.ymin fun.ymax 参数。

        2
  •  2
  •   ithinkiam    7 年前

    R或ggplot 2中的某些内容已更改,但stat\u summary()不再适用于geom=“平滑”选项。它需要是geom=“ribbon”。如R 3.6.0和ggplot 3.1.1中所述

    library(ggplot2)
    set.seed(47)
    
    ggplot(tibble::data_frame(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') + 
        stat_summary(fun.data = median_hilow, fun.args = list(conf.int = 0.5), 
                     geom = 'ribbon', color = 'red', fill = 'red', alpha = 0.2)
    
    推荐文章