如何让 ggplot2 geom_bar 通过它的因子水平而不是默认排序来绘制轴

How to get ggplot2 geom_bar to plot axis by it's factor levels and not by default sorting

我想在 ggplot2 中制作一个条形图,并让 ggplot2 按照我在 Day44$Sample 列中提供的相同顺序绘制我的 X 轴。这是一个示例(我的真实数据在 Day44$Sample 列中有 59 个因子水平。

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)))

我读过,为了按照与我的专栏相同的顺序绘制,我必须 'tell' ggplot2 我已经有一个有序的因子 - 基于这个 post:Avoid ggplot sorting the x-axis while plotting geom_bar()

在 post 之后:

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

当我收到以下错误时:

Error in levels<-(*tmp*, value = as.character(levels)) : factor level is duplicated

所以,我找到了这个 post:

并遵循该线索(省略 post 推荐的 sort,因为我不需要对其进行排序):

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*

Levels: 100 12 198* 41* 6 8

如何将其更改为我的级别与 Day44$Sample 的唯一值顺序相同?

我知道我可以像这样手动放入它们:

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

生成我想要的精确图表,但这不切实际,因为我的真实数据有 59 个级别,我也必须对多个其他图表执行此操作。我永远不会手动完成此操作。

有什么建议吗?

如果您想根据它们在数据框中出现的顺序对因子水平进行排序,请使用 forcats::fct_inorder:

Day44$Sample = forcats::fct_inorder(Day44$Sample)