theme - Поведение ggplot2 aes() в сочетании с facet_grid() при передаче переменной с обозначением знака доллара на aes()



how to ggplot2 (1)

ТЛ; др

Никогда не используйте [ или $ inside aes() .

Рассмотрим этот иллюстративный пример, где фасетная переменная f намеренно в неочевидном порядке относительно x

d <- data.frame(x=1:10, f=rev(letters[gl(2,5)]))

Теперь сравните то, что происходит с этими двумя сюжетами,

p1 <- ggplot(d) +
  facet_grid(.~f, labeller = label_both) +
  geom_text(aes(x, y=0, label=x, colour=f)) +
  ggtitle("good mapping") 

p2 <- ggplot(d) +
  facet_grid(.~f, labeller = label_both) +
  geom_text(aes(d$x, y=0, label=x, colour=f)) +
  ggtitle("$ corruption") 

Мы можем лучше понять, что происходит, если посмотреть на data.frame, созданный внутренне ggplot2 для каждой панели,

 ggplot_build(p1)[["data"]][[1]][,c("x","PANEL")]

    x PANEL
1   6     1
2   7     1
3   8     1
4   9     1
5  10     1
6   1     2
7   2     2
8   3     2
9   4     2
10  5     2

 ggplot_build(p2)[["data"]][[1]][,c("x", "PANEL")]

    x PANEL
1   1     1
2   2     1
3   3     1
4   4     1
5   5     1
6   6     2
7   7     2
8   8     2
9   9     2
10 10     2

Второй график имеет неправильное сопоставление, потому что когда ggplot создает data.frame для каждой панели, он выбирает значения x в «неправильном» порядке.

Это происходит потому, что использование $ ломает связь между различными переменными, которые должны быть сопоставлены (ggplot должен предположить, что это независимая переменная, которая, как известно, может исходить от произвольного, отключенного источника). Так как data.frame в этом примере не упорядочен в соответствии с коэффициентом f , то подмножество данных. Кадры, используемые внутри каждой панели, принимают неправильный порядок.

Я делаю некоторый анализ в ggplot2 на данный момент для проекта, и случайно я наткнулся на какое-то (для меня) странное поведение, которое я не могу объяснить. Когда я пишу aes (x = cyl, ...), график выглядит по-другому, чем он делает, если я передаю одну и ту же переменную с помощью aes (x = mtcars $ cyl, ...). Когда я удаляю facet_grid (am ~.), Оба графика снова повторяются. Код ниже смоделирован после кода в моем проекте, который генерирует одно и то же поведение:

library(dplyr)
library(ggplot2)

data = mtcars

test.data = data %>%
  select(-hp)


ggplot(test.data, aes(x = test.data$cyl, y = mpg)) +
  geom_point() + 
  facet_grid(am ~ .) +
  labs(title="graph 1 - dollar sign notation")

ggplot(test.data, aes(x = cyl, y = mpg)) +
  geom_point()+ 
  facet_grid(am ~ .) +
  labs(title="graph 2 - no dollar sign notation")

Вот изображение графика 1:

Вот изображение графика 2:

Я обнаружил, что могу обойти эту проблему, используя aes_string () вместо aes () и передавая имена переменных в виде строк, но я хотел бы понять, почему ggplot ведет себя таким образом.

Thx много за любую помощь заранее! Мне очень неудобно, если я не понимаю, что правильно ...





r-faq