Ответ 1
tl; dr
Никогда не используйте [
или $
внутри 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
, подмножество данных. Кадры, используемые внутри каждой панели, принимают неправильный порядок.