Ответ 1
Я не думаю, что могу действительно удовлетворить ваши требования "без создания нового фрейма данных", но вы можете создать новый кадр данных "на лету":
ggplot(transform(iris,
Species=factor(Species,levels=c("virginica","setosa","versicolor")))) +
geom_histogram(aes(Petal.Width))+ facet_grid(Species~.)
Я согласен, было бы неплохо, если бы был другой способ контролировать это, но ggplot
уже довольно мощный (и сложный) движок...
Заметим, что порядок (1) строк в наборе данных не зависит от порядка (2) уровней фактора. # 2 - это то, что factor(...,levels=...)
изменяется, и что ggplot
ищет, чтобы определить порядок фасетов. Выполнение # 1 (сортировка строк кадра данных в заданном порядке) представляет собой интересную задачу. Я думаю, что я действительно достиг этого, выполнив сначала # 2, а затем используя order()
или arrange()
для сортировки в соответствии с числовыми значениями фактора:
neworder <- c("virginica","setosa","versicolor")
library(plyr) ## or dplyr (transform -> mutate)
iris2 <- arrange(transform(iris,
Species=factor(Species,levels=neworder)),Species)
Я не могу сразу увидеть быстрый способ сделать это, не изменяя порядок уровней факторов (вы могли бы это сделать, а затем reset порядок уровней факторов соответственно).
В общем, функции из R, зависящие от порядка уровней категориальной переменной, основаны на порядке уровня фактора, а не на порядках строк в наборе данных: ответ выше применяется в более общем плане.