【问题标题】:ggplot2: How to manually fix the order in which bars appearggplot2:如何手动修复条出现的顺序
【发布时间】:2017-09-18 00:43:17
【问题描述】:

我在 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 会不断在不同的图中切换条形的顺序。有没有办法确保这种情况不会发生并且基因始终处于领先地位? 谢谢, 沙什

【问题讨论】:

    标签: r ggplot2 geom-bar


    【解决方案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()
    

    要按您需要的顺序获取条形图,请将名称变量作为一个因素,并设置级别的顺序。只有两个名字,你可以使用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()
    

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

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2022-08-24
      • 2019-05-19
      • 2020-08-24
      相关资源
      最近更新 更多