Как заставить ggplot2 geom_bar строить ось по уровням факторов, а не по сортировке по умолчанию

Я хотел бы создать гистограмму в ggplot2 и сделать так, чтобы ggplot2 отображал мою ось X в том же порядке, что и в моем столбце Day44 $ Sample. Вот пример (мои реальные данные имеют 59 уровней факторов в столбце Day44 $ Sample.

Day44 <- data.frame(Sample = c(rep(6, 3), rep(8, 5), rep(12, 8), rep(100, 7), rep("41*", 3), rep("198*", 5)),
                Phylum = c(rep("Proteobacteria", 3), rep("Actinobacteria", 5), rep("Firmicutes", 8), 
                          rep("Chloroflexi", 7), rep("Cyanobacteria", 3), rep("Bacteroidetes", 5)), 
                Rel_Abund = c(rep(2.2, 3), rep(0.15, 5), rep(0.047, 8), rep(1.2, 7), rep(0.33, 3), rep(4.5, 5)))

Я прочитал, что для построения графика в том же порядке, что и мой столбец, я должен «сказать» ggplot2, что у меня уже есть упорядоченный коэффициент - на основе этого сообщения: Избегайте сортировки ggplot по оси x при построении geom_bar ()

После публикации:

Day44$Sample <- factor(Day44$Sample, levels = Day44$Sample)

когда я получаю следующую ошибку:

Ошибка в _3 _ (_ 4_, value = as.character (levels)): factor level 2 дублируется

Итак, я нашел это сообщение: Предупреждение при определении фактора: повторяющиеся уровни в факторах не рекомендуются

и следуя этому примеру (опуская sort, рекомендованный в сообщении bc, мне не нужно его сортировать):

Day44$Sample <- factor(Day44$Sample, levels = unique(Day44$Sample)

который я затем рисую с помощью:

ggplot() + geom_bar(aes(x = Sample, y = Rel_Abund, fill = Phylum), data = Day44, stat = 'identity')

Тем не менее, это дает мне хороший барный сюжет; ось x все равно сортируется. Гистограмма

Этот фрагмент кода указывает мне на ошибку, которая дает:

factor(unique(Day44$Sample))

6 8 12 100 41* 198*

Уровни: 100 12 198 * 41 * 6 8

Как я могу изменить это так, чтобы мои уровни были в том же порядке, что и мои уникальные значения для Day44 $ Sample?

Я знаю, что могу вставить их вручную, вот так:

Day44$Sample <- factor(Day44$Sample, levels = c("6", "8", "12", "100", "41*", "198*"))

создание точного графика, который мне нужен, но это непрактично, поскольку мои реальные данные имеют 59 уровней, и мне также приходится делать это с несколькими другими графиками. Я никогда не закончу делать это вручную.

Какие-либо предложения?


person Purrsia    schedule 08.07.2019    source источник


Ответы (1)


Если вы хотите упорядочить уровни факторов в зависимости от того, в каком порядке они появляются во фрейме данных, используйте forcats::fct_inorder:

Day44$Sample = forcats::fct_inorder(Day44$Sample)
person Marius    schedule 08.07.2019
comment
Если подумать еще раз, Day44$Sample <- factor(Day44$Sample, levels = unique(Day44$Sample)) должно было сработать - возможно, стоит попробовать это еще раз, чтобы дважды проверить свое понимание. - person Marius; 08.07.2019
comment
Спасибо за рекомендацию. Я установил пакет forcats и запустил код, и он отлично сработал! Спасибо. - person Purrsia; 08.07.2019