Фасетирование с факторизованными переменными и geom_hline / geom_vline - PullRequest
0 голосов
/ 04 июля 2018

Рассмотрим этот код:

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. 

Google помог мне найти отладку, а именно упаковку 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 Ответ

0 голосов
/ 04 июля 2018

Итак, вот мое лучшее предположение и объяснение.

Когда Хэдли говорит:

Это известное ограничение фасетирования функцией - используемые вами переменные должны присутствовать на каждом слое.

Он означает, что в ggplot, когда вы собираетесь использовать функцию в функции фасетирования, вы должны иметь переменную в каждом geom. Проблема возникает из-за отсутствия переменной cyl в hline geom.

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

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

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

...