【问题标题】:direction of bars in ggplot barplot with log scale axes带有对数刻度轴的ggplot barplot中的条形方向
【发布时间】:2019-12-17 05:43:27
【问题描述】:

我正在尝试根据以下数据 (dataframe = df) 创建一个包含多个数据的条形图,该数据的 log10 y 轴具有小于 1 的非零值,如下图所示(在 graphpad 中创建):

No  Perc    Codon
1   72   ATA
2   12.7273  ATG
3   8.72727  GTG
4   0.727273     ATG
5   0.363636     GTG
6   0.363636     GTG
7   0.363636     GTG
8   0.363636     GTG
9   0.363636     GTG
10  0.363636     ATA
11  0.363636     ATA
12  0.363636     ATA
13  0.363636     ATA
14  0.363636     ATA
15  0.363636     ATA
16  0.363636     ATG
17  0.363636     ATG
18  0.363636     ATG
19  0.363636     ATG
20  0.363636     ATG

对以下数据使用 ggplot,我试图根据其他问题的其他信息创建类似的东西来解决我的问题(无济于事)。

ggplot(data=df,aes(x=No, y=Perc, color=Codon)) + geom_bar(stat="identity") + scale_y_log10( breaks=c(0.1, 1, 10, 100), limits=c(0.1, 100), position = "top") + coord_flip() + geom_segment( aes(x=No, xend=No, y=0.01, yend=Perc))

生成以下图像:

但是,尽管小于 1,我希望条形继续沿同一方向。此外,有没有办法可以将 x 轴重新定位到图表顶部并重新排序数据,以使最大值在graphpad生成的图像的顶部?

我知道其他类似的questions 已经描述了与条形方向类似的问题,但没有解决方案。

对于这个新手的任何帮助或建议将不胜感激。 谢谢!

【问题讨论】:

    标签: r ggplot2 geom-bar


    【解决方案1】:

    让我提供另一个答案,使用library(scales)

    您没有按正确的顺序放置命令,并且您无法进行真正的 log10 转换,因为低于 1 的值将变为负数。使用 library(scales) 您可以进行 pseudo_log 转换。这是我的解决方案:

    library(ggplot2)
    library(scales)
    
    df = data.frame("No" = seq_len(20),
                    "Perc" = c(72.0, 12.7273,
                               8.72727, rep(0.363636, 17)),
                    "Codon" = as.factor(c("ATA","ATG","GTG", "ATG",
                                          rep("GTG",5), rep("ATA",6),
                                          rep("ATG",5))))
    
    breaks <- unique(c(seq(0,1,by = 0.1), 
        seq(1,10, 1), seq(10,100, 10)))
    labs = c("","0.1",rep("",8),"1", 
        rep("",8), "10", rep("",8), "100")
    
    gg  <- ggplot(data = df, aes(x = No, y = Perc, fill = Codon))
    gg + geom_bar(stat = "identity") + 
    coord_flip(ylim = c(0.1,100)) + scale_x_reverse() +
        scale_y_continuous(
            trans = pseudo_log_trans(base = 10),
            breaks = breaks, position = "right",
            labels = labs)
    
    

    希望对你有帮助。

    奥利奥

    【讨论】:

    • 感谢 Oriol,这真的很有帮助,这正是我正在寻找的。也感谢您的教学点。
    • 实际上,我想知道是否有一种方法可以格式化 y 轴限制以及日志刻度注释。我尝试在scale_y_continuous 函数中使用参数limits = c(0.1, 100),但看起来geom_bar 不喜欢这样并导致警告:Removed 20 rows containing missing values (geom_bar)。此外,使用 annotate_logticks() 函数注释日志记号失败并导致错误:Error in unit(xticks$x, "native") : 'x' and 'units' must have length &gt; 0。对此有什么想法……?再次感谢。
    • 我已经编辑了答案以显示您的要求。据我所知,coord_flipannotate_logticks() 不兼容 (stackoverflow.com/questions/20460226/…)。您可以更改coord_flip 函数内的ylim,正如我在编辑中向您展示的那样。对于 logticks,我的方法是直接在 scale 函数中设置 logbreaks,只为更重要的数字放置标签。然后您可以使用theme 编辑轴格式以获得更好的外观。
    【解决方案2】:

    geom_bar 不能很好地与scale_y_log 配合使用。我认为最好的方法是使用geom_segment,因为您已经在尝试。请注意,您要求geom_segment0.01 开始,但您的y 轴仅从0.1 开始。调整aes 可以让您有所工作。怎么样:

    library(ggplot2)
    
    ggplot(data = df) +
      geom_segment(aes(x = No, 
                       xend = No, 
                       y = 0.1, 
                       yend = Perc, 
                       colour = Codon),
                   size = 3) +
      coord_flip() +
      scale_y_log10(name = "Perc",
                    breaks = c(0.1, 1, 10, 100), 
                    limits = c(0.1, 100), 
                    position = "top")
    

    如果其他人想尝试,我将以一种易于使用的方式在此处包含数据:

    
    txt <- "No  Perc    Codon
    1   72   ATA
    2   12.7273  ATG
    3   8.72727  GTG
    4   0.727273     ATG
    5   0.363636     GTG
    6   0.363636     GTG
    7   0.363636     GTG
    8   0.363636     GTG
    9   0.363636     GTG
    10  0.363636     ATA
    11  0.363636     ATA
    12  0.363636     ATA
    13  0.363636     ATA
    14  0.363636     ATA
    15  0.363636     ATA
    16  0.363636     ATG
    17  0.363636     ATG
    18  0.363636     ATG
    19  0.363636     ATG
    20  0.363636     ATG"
    
    df <- read.table(text = txt, header = TRUE)
    

    reprex package (v0.2.1) 于 2019 年 12 月 12 日创建

    【讨论】:

    • 这是一个很好的开始!也感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2020-09-04
    • 2013-04-13
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多