在ggplot2堆积条形图中按大小排序堆栈

时间:2012-02-10 11:58:02

标签: r ggplot2 bar-chart stackedbarseries

所以我有一些数据,我在下面作为例子采样:

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

ggplot stacked bar graph of the sample data

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

我希望能够按照该序列的丰度为每个尺寸订购彩色堆叠条。即,堆叠中具有最高丰度的条形位于每个堆叠的底部,而具有最低丰度的条形位于顶部。它应该看起来更加流畅。

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

2 个答案:

答案 0 :(得分:13)

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

enter image description here

但是,我可能会建议稍微不同的东西。由于你是在抑制将颜色映射到序列的比例,并且你的描述似乎表明你不关心特定的序列(并且会有很多),为什么不把它留下来呢?只需画出条纹的轮廓,没有任何填充颜色。

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

enter image description here

答案 1 :(得分:0)

您还可以在ggplot的美学效果中使用group参数来实现目标

ggplot(ab.tab,aes(x =长度,y =丰度,填充=序列,组=丰度))+ geom_bar(stat ='identity')

如果要执行相反的操作,即在每个堆栈的TOP部分中将其堆栈内具有最高丰度的条形排序,则在组参数的丰度之前使用负号

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