Фасетирование с факторизованными переменными и geom_hline / geom_vline
Рассмотрим этот код:
require(ggplot2)
ggplot(data = mtcars) +
geom_point(aes(x = drat, y = wt)) +
geom_hline(yintercept = 3) +
facet_grid(~ cyl) ## works
ggplot(data = mtcars) +
geom_point(aes(x = drat, y = wt)) +
geom_hline(yintercept = 3) +
facet_grid(~ factor(cyl)) ## does not work
# Error in factor(cyl) : object 'cyl' not found
# removing geom_hline: works again.
Гугл помог мне найти отладку, а именно упаковку intercept
в aes
ggplot(data = mtcars) +
geom_point(aes(x = drat, y = wt)) +
geom_hline(aes(yintercept = 3)) +
facet_grid(~ factor(cyl)) # works
# R version 3.4.3 (2017-11-30)
# ggplot2_2.2.1
Хэдли пишет здесь, что функции в качестве переменных должны быть на каждом уровне. (что звучит для меня загадочно)
Почему это происходит при факторизации фасетной переменной?
1 ответ
Вот мое лучшее предположение и объяснение.
Когда Хэдли говорит:
Это известное ограничение фасетирования с помощью функции - используемые вами переменные должны присутствовать на каждом слое.
Он означает, что в ggplot, когда вы собираетесь использовать функцию в функции фасетирования, вы должны иметь переменную в каждом geom
, Проблема возникает потому, что там cyl
переменная отсутствует в hline
geom
,
Важно помнить, что это ограничение, а не идеальное поведение. Более того, следствием того, как работает их эффективный код, является то, что при использовании функций для фасетирования переменные должны присутствовать в каждом geom
,
Не глядя на специфику ggplot2
функции, я думаю, что упаковка aes
вокруг yintercept
аргумент, это дать эстетическое отображение geom_hline
функция. aes
Функция отображает переменные в компоненты графика, а не в статические значения. Это важное различие. Хотя мы все еще устанавливаем yintercept = 3
тот факт, что мы поместили его в эстетическое отображение, должен как-то cyl
также существует в этом пространстве. То есть он соединяет geom_hline
косвенно с cyl
Это означает, что теперь он находится в слое и больше не является ограничением.
Это может быть не совсем удовлетворительный ответ, но без прочтения ggplot2
код, чтобы попытаться выяснить, почему именно возникает такое ограничение, это может быть так же хорошо, как вы получите сейчас. Надеемся, что одного из этих обходных путей будет достаточно для вас:)