使用 stat_summary 绘制中位数的位置

Dem*_*nos 2 r ggplot2

我想要一种方法来绘制一条垂直线,其中在直方图顶部的数据中每个组的中位数出现。我可以通过首先按组分组,将新列变异为中位数,然后按组分面来做到这一点。这是一些代码来做到这一点:

library(tidyverse)

N = 1000
m = c(1,5,10)
z = c('A','B','C')

d<-map2_dfr(m,z, ~data.frame(x = rbeta(N,shape1 =.x, shape2 = 20), z = .y))


d %>% 
  group_by(z) %>% 
  mutate(med = median(x)) %>% 
  ungroup %>% 
  ggplot(aes(x, fill = z))+
  geom_histogram(aes(y = ..density..),bins = 10,color = 'black')+
  geom_vline(aes(xintercept = med))+
  facet_wrap(~z)
Run Code Online (Sandbox Code Playgroud)

由于中位数的统计结果,我可以实现使用相同的结果stat_summary或者stat_functiongeom="vline"

teu*_*and 6

是的你可以; 有一些技巧。

由于stat_summary为每个 x 计算 y 的摘要,我们需要通过给它一个虚拟的 x 变量来欺骗函数,并将直方图的输入作为 y 提供。我发现给出一个在数据范围内的 dummy-x 效果最好,因为它不会影响轴限制。

在下面的代码中,假设dd用您的代码生成的。

ggplot(d, aes(x, fill = z)) +
  geom_histogram(aes(y = ..density..), bins = 10, colour = "black") +
  stat_summary(aes(x = 0.1, y = x, xintercept = stat(y), group = z), 
               fun.y = median, geom = "vline") +
  facet_wrap(~ z)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

与原图相比:

d %>% 
  group_by(z) %>% 
  mutate(med = median(x)) %>% 
  ungroup %>% 
  ggplot(aes(x, fill = z))+
  geom_histogram(aes(y = ..density..),bins = 10,color = 'black')+
  geom_vline(aes(xintercept = med))+
  facet_wrap(~z)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明