R 每个条形上有多个值的复杂叠加水平条形图
几个月来我一直在想如何做到这一点,所以希望有人能给我一些明确的答案。我创建了一个R脚本,它显示了数据库Genes表中的所有值。所以它给出了每个基因的长度(以核苷酸为单位),我将其水平排列 其主要思想是从另一个名为QGRS的表中获取值,该表包含每个QGRS的长度。我面临的问题是,在一个基因上有许多QGR,所以我不知道如何使用R来显示这一点。也许有更好的方法,但我的想法是让水平的基因长度条是一种颜色,让QGRS长度以不同的颜色显示在这些条的正上方,以突出QGRS在基因上的位置。这是所有的基因。我不知道如何在一个条上获得多个值,然后如何正确地叠加两个图形 我希望这是有道理的。以下是我所拥有的:R 每个条形上有多个值的复杂叠加水平条形图,r,graph,bar-chart,genome,R,Graph,Bar Chart,Genome,几个月来我一直在想如何做到这一点,所以希望有人能给我一些明确的答案。我创建了一个R脚本,它显示了数据库Genes表中的所有值。所以它给出了每个基因的长度(以核苷酸为单位),我将其水平排列 其主要思想是从另一个名为QGRS的表中获取值,该表包含每个QGRS的长度。我面临的问题是,在一个基因上有许多QGR,所以我不知道如何使用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()
这是QGRS表中的样本数据[基因'8682'的几行[上面样本数据的第一行]
Start End Chromosome
389 391 1
524 526 1
739 741 1
834 836 1
904 906 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)
)
现在我在结果图上查找每个基因的位置,然后使用rect
在现有图的正确位置绘制矩形
idx < -match(qgrs$GeneID, genes$GeneID)
with(qgrs, rect(Start,bb[idx]-ww/2,End, bb[idx]+ww/2, col="green"))
idx<-match(qgrs$GeneID,genes$GeneID)
使用(qgrs,rect(开始,bb[idx]-ww/2,结束,bb[idx]+ww/2,col=“绿色”))
这将导致下面的图
现在,如果您的区域非常小,您可能需要在
矩形上设置border=NA
。默认情况下,R将在形状周围绘制黑色边框,如果形状太小,则基本上边框只绘制在颜色上,看起来只是黑色。您还可以将边框设置为矩形的颜色,以使其更黑一些宽度。在oredr中,为了更方便地帮助您,粘贴示例数据也会很有帮助,以便我们运行您的代码和解决您的问题。它不必是真实的数据,也不必很长,但类似于您输入的内容将是有益的。这非常聪明!非常感谢!我现在必须调整它,以便至少它可以从文件中获取数据(因为文件太多了!)。我不应该感到惊讶,但老实说,我很高兴你能帮助我!!这是一个非常简单和聪明的方法,我喜欢。
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
)
idx < -match(qgrs$GeneID, genes$GeneID)
with(qgrs, rect(Start,bb[idx]-ww/2,End, bb[idx]+ww/2, col="green"))