我问 this刚才的问题。在这种情况下,该解决方案有时似乎有效。这是使用 mpg
的示例数据集。
我的目标是使用 stat_summary
在每个方面的数据中位数出现的位置放置一条垂直线。 .请注意,当我在 displ
上使用链接问题中的解决方案时列,该解决方案按需要工作。但是当我在cty
上使用它时列,绘制多条线。为什么是这样?
下面显示的是我的问题的代表。
library(tidyverse)
mpg %>%
ggplot(aes(x=displ, group=cyl))+
geom_histogram()+
facet_grid(~cyl)+
stat_summary(aes(xintercept=stat(x), y=0), fun = median, geom = 'vline')
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
mpg %>%
ggplot(aes(x=cty, group=cyl))+
geom_histogram()+
facet_grid(~cyl)+
stat_summary(aes(xintercept=stat(x), y=0), fun = median, geom = 'vline')
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
创建于 2020-04-01 由 reprex package (v0.3.0)
最佳答案
我们可以使用 group_by
预先计算中位数和 mutate
,我经常发现它的行为更可靠且易于理解,然后只需使用 geom_vline
.无法回答 stat_summary
一边,但有兴趣知道答案。
mpg %>%
group_by(cyl) %>%
mutate(cty_med = median(cty)) %>%
ggplot(aes(x=cty))+
geom_histogram()+
facet_grid(~cyl)+
geom_vline(aes(xintercept=cty_med))
如果您想对此进行概括,您可以创建一个包装函数来一起进行计算和分面。
f <- function(df, fct, var) {
df %>%
group_by({{fct}}) %>%
mutate(med = median({{var}})) %>%
ggplot(aes(x={{var}}))+
geom_histogram() +
facet_grid(cols = vars({{fct}})) +
geom_vline(aes(xintercept=med))
}
f(mpg, cyl, cty)
f(mpg, cyl, displ)
关于r - 为什么 stat_summary 会根据变量绘制多条/单条线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60965322/