tl; dr
Never use [ or $ inside aes() .
Consider this illustrative example, where the facet variable f intentionally in non-obvious order with respect to x
d <- data.frame(x=1:10, f=rev(letters[gl(2,5)]))
Now compare what happens to these two graphs,
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")

We can get a better idea of ββwhat happens if we look at the data.frame created inside ggplot2 for each panel,
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
The second graph has a wrong mapping, because when ggplot creates data.frame for each panel, it selects the x values ββin the "wrong" order.
This is due to the fact that using $ breaks the connection between the various displayed variables (ggplot should consider it an independent variable, which, as you know, can come from an arbitrary, unrelated source). Since the data.frame in this example is not ordered according to the coefficient f , a subset of the data. The frames used inside each panel are in the wrong order.