【问题标题】:Use stat_summary to label median line on boxplot使用 stat_summary 在箱线图上标注中线
【发布时间】:2019-11-20 16:41:05
【问题描述】:

我有一个函数,我试图使用stat_summary()geom_boxplot() 上的中线上方绘制中值。我减少了我的问题并创建了一个玩具示例来简化但保留上下文。

library(ggplot2)

set.seed(20191120)

dat <- data.frame(var   = sample(c("a", "b"), 
                           50, 
                           replace = TRUE),
                   value = rpois(50, 5))

lims <- c(0, 10)

myplot <- function(DATA, YLIMS) {
  ggplot(data  = DATA,
         aes(x = var)) +
    geom_boxplot(aes(y = value),
                 outlier.shape = NA,
                 coef = 0) +
    stat_summary(aes(y = ifelse(value > (YLIMS[2]*0.9),   # if median in top10% of plot window
                                (value - (YLIMS[2]/10)),  # put it below bar
                                (value + (YLIMS[2]/10))), # else put it above
                     label = round(..y.., 2)), #round(median(value), 2))
                 fun.y = median, 
                 geom = "text") +
    coord_cartesian(ylim = YLIMS)
}

myplot(dat, lims)

我的实际地块有几个方面,各种范围,并且一些中位数位于范围的顶部或底部。如您所见,我已经排除了胡须和异常值。这就是 YLIMS 参数用于放大和关注框并排除未使用的绘图空间的地方。我还使用这些 YLIMS 值将标签定位在 +/- 10% 的范围内,效果非常好。

我尝试使用 ..y.. 值来获取 stat_summary(aes()) 的标签参数的中值,但它取而代之的是新值。从图中可以看出,我们希望两个标签都是“5”,但它们是“6”,因为添加了 10 的 10%。

我还尝试重新计算中位数(如您所见已注释掉),但这需要所有数据的简单中位数,并且不能控制分组/方面/等。

我知道如何重构我的代码以计算为数据中的 y 标签和位置创建值,或者通过聚合和使用箱线图的标识,但我想知道是否有一种方法可以计算这个-line 就像我的尝试即将完成。

【问题讨论】:

    标签: r ggplot2 boxplot


    【解决方案1】:

    解决这个问题的关键不是试图调整值,而是使用postion=position_nudge()选项移动位置。

    library(ggplot2)
    set.seed(20191120)
    
    dat <- data.frame(var   = sample(c("a", "b"), 50, replace = TRUE),
                      value = rpois(50, 5))
    lims <- c(0, 10)
    
    myplot <- function(DATA, YLIMS) {
      ggplot(data  = DATA, aes(x = var)) +
        geom_boxplot(aes(y = value), outlier.shape = NA, coef = 0) +
        stat_summary(aes(y = value , label = round(..y.., 2)), 
                     fun.y = median, geom = "text", 
                     position=position_nudge(y = ifelse(value > (YLIMS[2]*0.9), #if median in top 10% of plot window
                                                                (-YLIMS[2]/10), #put it below bar
                                                                (YLIMS[2]/10)), x = 0)) +
        coord_cartesian(ylim = YLIMS)
    }
    
    myplot(dat, lims)
    

    【讨论】:

    • 您的解决方案几乎就在那里,我必须在轻推调用中添加dat$ 以使其成为... y = ifelse(dat$value &gt; ...。加/减不起作用,但这不在这个问题的范围内,因为我没有提供它。我尝试了 Julius 的解决方案,但没有成功 (stackoverflow.com/questions/54535180/…)。最终选择了position = position_nudge(y = -YLIMS[2]/20 + YLIMS[2]/10 * (dat$value &gt; 0), x = 0)),并调整了绘图窗口上的 ymax 以使其适合上方。
    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多