ggplot2:如何手动修复条形显示的顺序

时间:2017-04-21 06:32:10

标签: r ggplot2 geom-bar

我在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"))

省略处理格式化的其他代码。最终的情节看起来像这样: enter image description here

现在,问题是我正在使用for循环绘制100多个这样的图,我想始终保持基因(列表元素中的第一行)作为顶部条和蛋白质是由于我省略了所有标签并计划对所有图使用单个图例,因此底栏。但是,ggplot会不断切换不同图表中条形的顺序。有没有办法确保那不会发生并且基因始终保持最佳状态? 谢谢, 词shash

1 个答案:

答案 0 :(得分:1)

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

Bars Alphabetically Ordered

要按所需顺序获取条形,请将名称变量设为一个因子,然后设置级别的顺序。只需两个名称,您可以使用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()

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

Order changed