首页 文章

ggplot2:为每个方面添加具有总体中位数的hline

提问于
浏览
7

我想绘制一个水平小平面线与该方面的总体中位数 .

我尝试了这种方法,但没有使用以下代码创建虚拟汇总表:

require(ggplot2)

dt = data.frame(gr = rep(1:2, each = 500),
            id = rep(1:5, 2, each = 100), 
            y = c(rnorm(500, mean = 0, sd = 1), rnorm(500, mean = 1, sd = 2)))


ggplot(dt, aes(x = as.factor(id), y = y)) +
  geom_boxplot() +
  facet_wrap(~ gr) +
  geom_hline(aes(yintercept = median(y), group = gr), colour = 'red')

但是,为每个方面分别绘制整个数据集的中位数而不是中位数的行:
enter image description here

过去,建议使用solution

geom_line(stat = "hline", yintercept = "median")

但它已经停止(产生错误“没有名为StatHline的统计数据”) .

另一个solution建议

geom_errorbar(aes(ymax=..y.., ymin=..y.., y = mean))

但它产生了

Error in data.frame(y = function (x, ...)  : 
arguments imply differing number of rows: 0, 1000

最后,有一种方法可以通过创建具有所需统计数据的_2500369来绘制中位数,但我想避免它 .

1 回答

  • 16

    您可以在 dt 中为每个方面的中位数创建一个额外的列 .

    library(dplyr) # With dplyr for example
    dt <- dt %>% group_by(gr) %>%
      mutate(med = median(y))
    
    # Rerun ggplot line with yintercept = med
    ggplot(dt, aes(x = as.factor(id), y = y)) +
      geom_boxplot() +
      facet_wrap(~ gr) +
      geom_hline(aes(yintercept = med, group = gr), colour = 'red')
    

    enter image description here

相关问题