Фасетирование с факторизованными переменными и 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 переменная отсутствует в hlinegeom,

Важно помнить, что это ограничение, а не идеальное поведение. Более того, следствием того, как работает их эффективный код, является то, что при использовании функций для фасетирования переменные должны присутствовать в каждом geom,

Не глядя на специфику ggplot2 функции, я думаю, что упаковка aes вокруг yintercept аргумент, это дать эстетическое отображение geom_hline функция. aes Функция отображает переменные в компоненты графика, а не в статические значения. Это важное различие. Хотя мы все еще устанавливаем yintercept = 3тот факт, что мы поместили его в эстетическое отображение, должен как-то cyl также существует в этом пространстве. То есть он соединяет geom_hline косвенно с cylЭто означает, что теперь он находится в слое и больше не является ограничением.

Это может быть не совсем удовлетворительный ответ, но без прочтения ggplot2 код, чтобы попытаться выяснить, почему именно возникает такое ограничение, это может быть так же хорошо, как вы получите сейчас. Надеемся, что одного из этих обходных путей будет достаточно для вас:)

Другие вопросы по тегам