Я сделал еще один пост, потому что я считаю, что мое исследование и решение достаточно отличаются от оригинала, чтобы оправдать его, но я могу объединиться, если кто-то не согласен. Итак, я считаю, что я выяснил причину проблемы с stat_summary
и вашим текущим решением.
Я считаю, что stat_summary
вычисляет свою сводную статистику c для каждого уникального значения x
, когда переменная x
принимает целочисленные значения.
library(tidyverse)
sapply(mpg, class)
#> manufacturer model displ year cyl trans
#> "character" "character" "numeric" "integer" "integer" "character"
#> drv cty hwy fl class
#> "character" "integer" "integer" "character" "character"
См. Ниже то же самое ранее при использовании hwy
и cty
, даже когда оба явно преобразуются в numeric
вместо integer
векторов.
mpg2 <- mpg %>%
mutate(hwy = as.numeric(hwy),
cty = as.numeric(cty))
sapply(mpg2, class)
#> manufacturer model displ year cyl trans
#> "character" "character" "numeric" "integer" "integer" "character"
#> drv cty hwy fl class
#> "character" "numeric" "numeric" "character" "character"
mpg2 %>%
ggplot(aes(x=hwy, group=cyl))+
geom_histogram()+
facet_grid(~cyl)+
stat_summary(aes(xintercept=stat(x), y=0), fun = median, geom = 'vline')
И пример с cty
:
mpg2 %>%
ggplot(aes(x=cty, group=cyl))+
geom_histogram()+
facet_grid(~cyl)+
stat_summary(aes(xintercept=stat(x), y=0), fun = median, geom = 'vline')
Однако, если мы сделаем Небольшая корректировка до cty
перед построением графика, добавление минутной десятичной точки, мы получаем желаемое поведение.
mpg %>%
mutate(cty = cty + .000001) %>%
ggplot(aes(x=cty, group=cyl))+
geom_histogram()+
facet_grid(~cyl)+
stat_summary(aes(xintercept=stat(x), y=0), fun = median, geom = 'vline')
И мы видим такое же поведение с hwy
.
mpg %>%
mutate(hwy = hwy + .000001) %>%
ggplot(aes(x=hwy, group=cyl))+
geom_histogram()+
facet_grid(~cyl)+
stat_summary(aes(xintercept=stat(x), y=0), fun = median, geom = 'vline')
Конечно, это не обязательно желаемое решение. Так как мы отображаем вертикальные линии, мы можем вместо этого создать новый aes
, где вместо этого мы построим наш xintercept
как функцию y
и предоставим одну фиктивную переменную для x
в пределах нашего диапазона данных. Это затем обманывает систему, заставляя строить только одну медиану от нашего единственного значения x
, и дает нам желаемый график.
mpg %>%
ggplot(aes(x=cty, group = cyl))+
geom_histogram()+
facet_grid(~cyl)+
stat_summary(aes(x = 3, y = cty, xintercept = stat(y)), fun = median, geom = 'vline')
И там мы go! Совершенно запутанный, и не очень-то нравится в качестве решения, но я считаю, что вы должны go использовать stat_summary
.