使用stat_summary在箱线图上标记中间线

我有一个函数,其中我试图使用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())的label参数的中值,但取而代之的是获取新值。从图中可以看到,我们希望两个标签都为“ 5”,但它们却为“ 6”,因为已添加10中的10%。

使用stat_summary在箱线图上标记中间线

我也尝试过重新计算中位数(如您所见,已注释掉),但是它只获取所有数据的简单中位数,并且无法控制分组/构面/等。

我知道重构代码的方法,以便为数据中的y标签和位置创建值,或者通过与箱图聚合并使用同一性,但是我想知道是否有一种方法可以计算出-line就像我的尝试快要完成了。

hexiansheng108 回答:使用stat_summary在箱线图上标记中间线

解决此问题的关键不是尝试调整值,而是使用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)
本文链接:https://www.f2er.com/3063966.html

大家都在问