每个条上具有多个值的复杂叠加水平R条形图

时间:2014-06-01 22:52:17

标签: r graph bar-chart genome

我几个月来一直试图弄清楚如何做到这一点,所以希望有人可以给我一些清晰度。我创建了一个R脚本,显示数据库的Genes表中的所有值。因此它给出了每个基因的长度(以核苷酸计),并且我将其水平放置。

主要思想是从另一个名为QGRS的表中获取值,该表包含每个QGRS的长度。我遇到的问题是单个基因上有很多QGRS,所以我无法弄清楚如何使用R来表明这一点。可能有更好的方法,但我的想法是让水平基因长度条成为一种颜色,并且QGRS长度在这些条上显示为不同的颜色,以突出QGRS在基因上的位置。这适用于所有基因。我不明白如何在一个条上获得多个值,然后如何正确地叠加这两个图。

我希望这是有道理的。这就是我所拥有的:

        ############## Setup for Chromosome Lengths ############## 
quartz()    #for mac
genes<-read.delim("genes_plot.out", header=FALSE)
sortmat<-genes[order(genes$V2),]

#qgrs<-read.delim("qgrs_plot.out", header=FALSE)

    ############## Generate Horizontal Genes Plot ############## 
par(bg = "darkseagreen1")
png("genes_plot.png", height=1500, width=1000)  
barplot( sortmat[,3], names.arg=sortmat[,1], col="red",      #genes
    horiz=TRUE,
    las='1',
    main="Human QGRS by Genes",
    ylab="",
    space=30,
    xlab="Length of Gene [# of nucleotides]",   )
mtext("Gene ID [RefSeq]", side=0, line=2)

    ############## Include QGRS over Genes Plot ############## 
#par(new=TRUE)  #to superimpose the two barplots
#barplot( qgrs[,1] )    #qgrs

        ############## End ############## 
dev.off()

这就是输出的内容[长图!]: enter image description here

**请注意,左边的数字有点被截断,我不知道为什么......但它们是直接来自NCBI的基因ID,只是将它们标记为的参考。


如果需要更多信息,请与我们联系。请,任何帮助,我将不胜感激。我真的试图寻找几个月的答案(这整个上学期),但我认为我不是很有能力。这对我来说太复杂了。

现在我知道我可以为QGRS制作另一张图,但如果它是这样的话,它们会分别出现在不同的线上!所以这没有帮助。

另外,我的Genes表就是这样的。对于人类基因组中的所有染色体,每个染色体有5个基因(如果分别计算X和Y,则为24个)。因此,如果需要,基因图也可以组合成只有24行,每行由5个基因组成,但我怀疑这有帮助。

-------- EDIT ------------

这是来自Genes表的样本数据,染色体1和2的5个基因:

GeneID   Chromosome   Length [nucleotides]
8682    1   10037
10623   1   18364
441878  1   858
645382  1   2986
650901  1   917
841         2   54268
28949   2   38
80303   2   76724
729992  2   1072
100873329   2   106

以下是来自QGRS表的样本数据[Gene'8682'[上述样本数据的第一行]只有几行

   Start    End    Chromosome
    389     391     1
    524     526     1
    739     741     1
    834     836     1
    904     906     1

1 个答案:

答案 0 :(得分:1)

好的,我必须稍微调整一下测试数据。 QGRS值的范围与长度的比例相比非常小,它们基本上没有绘制。在大多数情况下,它们的宽度小于一个像素。所以我加强了他们。我还添加了一个GeneID列,以便我可以匹配它们

#sample data
genes<-data.frame(
    GeneID = c(8682, 10623, 441878, 645382, 650901, 
        841, 28949, 80303, 729992, 100873329), 
    Chromosome = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2),
    Length = c(10037, 18364, 858, 2986, 917, 54268, 
        38, 76724, 1072, 106)
)

qgrs<-data.frame(
    Start = c(500, 7500, 2200, 25000, 61000), 
    End = c(1100, 8200, 3400, 30000, 64000), 
    Chromosome = c(1L, 1L, 2L, 2L, 2L),
    GeneID=c(8682, 8682, 80303, 80303, 80303)
)

所以我想明确设置一个宽度,我也捕获barplot的输出,所以我知道每个值都被绘制了。

ww<-20
bb<-barplot( genes[,3], names.arg= genes[,1], 
    col="red", horiz=TRUE,
    las='1', main="Human QGRS by Genes",
    ylab="", xlab="Length of Gene [# of nucleotides]",
    space=.5,
    width=ww
)

现在我在结果图上查找每个基因的位置,然后我使用rect在正确位置的现有图上绘制矩形

idx < -match(qgrs$GeneID, genes$GeneID)
with(qgrs, rect(Start,bb[idx]-ww/2,End, bb[idx]+ww/2, col="green"))

这导致以下图表。

resulting plot

现在,如果您的区域很小,则可能需要在border=NA上设置rect。默认情况下,R会在形状周围绘制一个黑色边框,如果形状太小,基本上边框只会覆盖颜色而它看起来只是黑色。您还可以将边框设置为矩形的颜色,以使它们更宽一些。