【问题标题】:How to make stacked bar chart with count values on y axis>如何制作 y 轴计数值的堆积条形图>
【发布时间】:2020-12-27 20:54:06
【问题描述】:

我正在尝试创建一个包含基因测序数据的堆叠条形图,其中每个基因都有一个 tRF.type 和 Amino.Acid 值。示例数据集如下所示:

tRF <- c('tRF-26-OB1690PQR3E', 'tRF-27-OB1690PQR3P', 'tRF-30-MIF91SS2P46I')
tRF.type <- c('5-tRF', 'i-tRF', '3-tRF')
Amino.Acid <- c('Ser', 'Lys', 'Ser')
tRF.data <- data.frame(tRF, tRF.type, Amino.Acid)

我希望 x 轴代表氨基酸类型,y 轴代表每种 tRF 类型的计数,条形的填充代表每种 tRF 类型。

我的代码是:

ggplot(chart_data, aes(x = Amino.Acid, y = tRF.type, fill = tRF.type)) + 
    geom_bar(stat="identity") + 
    ggtitle("LAN5 - 4 days post CNTF treatment") +
    xlab("Amino Acid") +
    ylab("tRF type")

但是,它会生成此图,其中 y 轴标有 tRF 类型的类别。如何更改我的代码,使 y 轴刻度为数字并表示每种 tRF 类型的计数?

Barchart

【问题讨论】:

  • 能否请您发布一些示例数据?
  • 嗨,我已经更新了示例数据。谢谢!

标签: r ggplot2


【解决方案1】:

您希望您的 y 轴是一个计数,而不是 tRF.type。这段代码应该给你正确的情节:我从ggplot()中删除了y = tRF.type,从geom_bar()中删除了stat = "identity(它使用stat = "count的默认值代替)。

ggplot(tRF.data, aes(x = Amino.Acid, fill = tRF.type)) + 
     geom_bar() + 
     ggtitle("LAN5 - 4 days post CNTF treatment") +
     xlab("Amino Acid") +
     ylab("tRF type")

【讨论】:

    【解决方案2】:

    OP,欢迎来到 SO。在以后的问题中,请务必提供minimal reproducible example - 意思是提供代码、图像(如果可能)以及至少一个可以清楚地展示您的问题或问题的代表性数据集。

    TL;DR - 不要使用stat="identity",只需使用geom_bar() 而不提供统计信息,因为默认是使用计数。这应该有效:

    ggplot(chart_data, aes(x = Amino.Acid, fill = tRF.type)) + geom_bar()
    

    提供的数据集无法充分证明您的问题,因此这里有一个可行的。此处的示例数据由 100 个观察值和两列组成:一列称为 Capitals 用于随机选择的大写字母,另一列称为 Lowercase 用于随机选择的小写字母。

    library(ggplot2)
    set.seed(1234)
    df <- data.frame(
      Capitals=sample(LETTERS, 100, replace=TRUE),
      Lowercase=sample(letters, 100, replace=TRUE)
    )
    

    如果我绘制类似于你的代码,你可以看到结果:

    ggplot(df, aes(x=Capitals, y=Lowercase, fill=Lowercase)) +
      geom_bar(stat="identity")
    

    您可以看到,条形图是堆叠的,但 y 轴全部向下平滑。原因与了解geom_bar()geom_col() 的区别有关。检查the documentation for these functions,您可以看到主要区别在于geom_col() 将绘制高度等于y 美学的条形图,而geom_bar() 默认情况下根据stat="count" 绘制。事实上,使用geom_bar(stat="identity")实际上只是一种复杂的表达方式geom_col()

    由于您的y 审美不是数字,ggplot 仍然尝试以数字方式处理离散级别。它的效果并不好,这就是为什么你的轴会像这样被压扁的原因。你想要的是geom_bar(stat="count").... 这与只使用geom_bar() 而不提供stat= 相同。

    一个问题是geom_bar() 只接受x y 美学。这意味着您应该只给它其中之一。这解决了问题,现在您得到了正确的图表:

    ggplot(df, aes(x=Capitals, fill=Lowercase)) + geom_bar()
    

    【讨论】: