Подтвердить что ты не робот

Контролирующий порядок facet_grid/facet_wrap в ggplot2?

Я рисую вещи, используя facet_wrap и facet_grid в ggplot, например:

ggplot(iris) + geom_histogram(aes(iris$Petal.Width)) + facet_grid(Species ~ .)

Можно ли управлять порядком, в котором панели Species упорядочены на графике? Можно ли это сделать без изменения фрейма iris или создания нового? По умолчанию здесь показаны setosa, versicolor, virginica, но мне нужен другой порядок. спасибо.

4b9b3361

Ответ 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, зависящие от порядка уровней категориальной переменной, основаны на порядке уровня фактора, а не на порядках строк в наборе данных: ответ выше применяется в более общем плане.