我想要一种方法来绘制一条垂直线,其中在直方图顶部的数据中每个组的中位数出现。我可以通过首先按组分组,将新列变异为中位数,然后按组分面来做到这一点。这是一些代码来做到这一点:
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_function有geom="vline"?
是的你可以; 有一些技巧。
由于stat_summary为每个 x 计算 y 的摘要,我们需要通过给它一个虚拟的 x 变量来欺骗函数,并将直方图的输入作为 y 提供。我发现给出一个在数据范围内的 dummy-x 效果最好,因为它不会影响轴限制。
在下面的代码中,假设d是d用您的代码生成的。
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)
| 归档时间: |
|
| 查看次数: |
832 次 |
| 最近记录: |