ggplot2:如何手动修复条形图出现的顺序

ggplot2: How to manually fix the order in which bars appear

我正在 for 循环中使用 ggplot 绘制和保存多个图,循环遍历列表。示例列表元素如下所示:

head(genes[[1]])

name              fc                  fdr
gene1         -2.0143529             0.0002
protein1      -3.2256188             0.0001

我使用了以下代码来绘制:

p<-list()
for(i in 1:length(genes)){
p[[i]]<-ggplot(genes[[i]], aes(name,fc, label= name))+
geom_col(aes(fill=factor(fdr < 0.05)), position = "dodge", width = 1)+
coord_flip()+scale_fill_manual(values = c("#00BFC4","#F8766D"))

省略处理格式化的附加代码。最终的情节是这样的:

现在,问题是我正在使用 for 循环绘制 100 多个这样的图,我希望始终将基因(列表元素中的第一行)保持在顶部栏,将蛋白质保持在顶部栏成为底部栏,因为我省略了所有标签并计划为所有图使用一个图例。但是,ggplot 会不断切换不同绘图之间的条形顺序。有没有办法确保这种情况不会发生并且基因始终保持在最前面? 谢谢, 哈希

ggplot 将按名称的字母顺序对条形图进行排序。

例如

library(ggplot2)

df <- data.frame(name = c("A-gene", "B-protein"), fc = c(-2.2, -3.2), fdr = c(0.2, 0.003))

ggplot(df, aes(name,fc, label= name))+
    geom_col(aes(fill=factor(fdr < 0.05)), position = "dodge", width = 1)+
    coord_flip()+scale_fill_manual(values = c("#00BFC4","#F8766D"))
dev.off()

要按照您需要的顺序获取条形图,请将名称变量作为一个因子,并设置级别的顺序。只有两个名字,你可以使用 relevel 如下

library(ggplot2)
df <- data.frame(name = c("A-gene", "B-protein"), fc = c(-2.2, -3.2), fdr = c(0.2, 0.003))

df$name <- relevel(df$name, as.character(df$name[2])) 

ggplot(df, aes(name,fc, label= name))+
    geom_col(aes(fill=factor(fdr < 0.05)), position = "dodge", width = 1)+
    coord_flip()+scale_fill_manual(values = c("#00BFC4","#F8766D"))
dev.off()

这使得第二行(蛋白质)成为原点旁边的条。