【问题标题】:Ordering stacks by size in a ggplot2 stacked bar graph在 ggplot2 堆积条形图中按大小排序堆栈
【发布时间】:2012-03-02 21:34:52
【问题描述】:

所以我有大量的数据,我已经采样如下示例:

Sequence  Abundance   Length
CAGTG    3       25
CGCTG    82      23
GGGAC    4       25
CTATC    16      23
CTTGA    14      25
CAAGG    9       24
GTAAT    5       24
ACGAA    32      22
TCGGA    10      22
TAGGC    30      21
TGCCG    25      21
TCCGG    2       21
CGCCT    22      24
TTGGC    4       22
ATTCC    4       23

我在这里只显示每个序列的前 4 个单词,但实际上它们是“长度”长的。我正在查看我在这里拥有的每个大小类别的序列丰度。此外,我想可视化特定序列在其大小类别中所代表的丰度比例。目前,我可以制作这样的堆叠条形图:

ggplot(tab, aes(x=Length, y=Abundance, fill=Sequence)) 
  + geom_bar(stat='identity') 
  + opts(legend.position="none")

这对于像这样的小型数据集来说很好,但我的实际数据集中有大约 170 万行。它看起来非常丰富多彩,我可以看到特定序列在一个大小类别中占多数,但它非常混乱。

我希望能够按该序列的丰度为每个尺寸订购彩色堆叠条。即,其堆栈中丰度最高的条位于每个堆栈的底部,而丰度最低的条位于顶部。这样看起来应该更漂亮。

关于如何在 ggplot2 中执行此操作的任何想法?我知道 aes() 中有一个“订单”参数,但我无法弄清楚它应该如何处理我拥有的格式的数据。

【问题讨论】:

  • @gsk3 -- 我认为 OP 在这里要求的东西略有不同。我想 kukimbob 不是想按它们的总高度对条形图进行排序,而是在询问如何对每个条形 的彩色块进行排序,将最大的块放在底部,沿 x 轴向下,而顶部最小。 (即每个条形中的颜色顺序可能在条形之间存在很大差异)。
  • @JoshO'Brien 完全正确! x 轴上的排序很好:从最小长度到最长。我只是希望能够操纵每个条形图中彩色堆栈的顺序。
  • 啊,这绝对是一个不同的问题。道歉。
  • 我认为您需要预先计算数据(例如使用plyr::count),然后使用将订单美学映射到计数。请注意,cran 版本的订单美学有问题,您可能需要使用 dev 版本。

标签: r ggplot2 bar-chart stackedbarseries


【解决方案1】:

您也可以使用 ggplot 美学中的 group 参数来实现您的目标

ggplot(ab.tab, aes(x=Length, y=Abundance, fill=Sequence, group=Abundance)) + geom_bar(stat='identity')

如果您想做相反的事情,即在每个堆栈的 TOP 部分对堆栈中丰度最高的条进行排序,然后在 Abundance for group 参数之前使用负号

ggplot(ab.tab, aes(x=Length, y=Abundance, fill=Sequence, group=-Abundance)) + geom_bar(stat='identity')

【讨论】:

    【解决方案2】:

    在 ggplot2 的堆叠条形图中绘制条形的顺序(从下到上)基于定义组的因子的顺序。所以Sequence 因子必须根据Abundance 重新排序。但要获得正确的堆叠顺序,必须颠倒顺序。

    ab.tab$Sequence <- reorder(ab.tab$Sequence, ab.tab$Abundance)
    ab.tab$Sequence <- factor(ab.tab$Sequence, levels=rev(levels(ab.tab$Sequence)))
    

    现在使用您的代码给出您要求的情节

    ggplot(ab.tab, aes(x=Length, y=Abundance, fill=Sequence)) +
      geom_bar(stat='identity') +
      opts(legend.position="none")
    

    不过,我可能会推荐一些稍微不同的东西。由于您正在抑制将颜色映射到序列的比例,并且您的描述似乎表明您无论如何都不关心特定序列(并且会有很多),为什么不把那部分排除在外呢?只画条的轮廓,不用任何填充颜色。

    ggplot(ab.tab, aes(x=Length, y=Abundance, group=Sequence)) +
      geom_bar(stat='identity', colour="black", fill=NA)
    

    【讨论】:

    • 这很好用,谢谢!而且您的建议比我目前的建议要好得多,因为对于跨大小类的不同读取具有相同的颜色会混淆解释。
    • 如何按列排序?
    • @AlexT 我不认为可以为不同的酒吧以不同的方式对酒吧内的类别进行排序。
    • 在最新版本的 ggplot2 中,当 stat = "identity" 填充段的顺序不再遵守因子水平的顺序时(当 position = "fill"position = "stack" 时)。相反,您现在必须对原始数据框进行排序,以使数据本身处于“正确”的顺序。见here
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2016-06-29
    相关资源
    最近更新 更多