我真的需要你的R技能。几天来一直在使用这个情节。我是R新手,所以这可以解释一下。
我有染色体的序列覆盖率数据(基本上是沿着每条染色体长度的每个位置的值,使得载体的长度数百万)。我想对我的阅读做一个很好的报道。这是我到目前为止所得到的:
看起来没问题,但是我错过了y标签,所以我可以分辨出它是哪条染色体,而且我一直无法修改x轴,所以它会在覆盖结束的地方结束。此外,我自己的数据要大得多,这使得这个情节特别需要很长时间。这就是我尝试这个HilbertVis plotLongVector的原因。它工作但我无法弄清楚如何修改它,x轴,标签,如何记录y轴,并且矢量都在绘图上获得相同的长度,即使它们不是同样长。
source("http://bioconductor.org/biocLite.R")
biocLite("HilbertVis")
library(HilbertVis)
chr1 <- abs(makeRandomTestData(len=1.3e+07))
chr2 <- abs(makeRandomTestData(len=1e+07))
par(mfcol=c(8, 1), mar=c(1, 1, 1, 1), ylog=T)
# 1st way of trying with some code I found on stackoverflow
# Chr1
plotCoverage <- function(chr1, start, end) { # Defines coverage plotting function.
plot.new()
plot.window(c(start, length(chr1)), c(0, 10))
axis(1, labels=F)
axis(4)
lines(start:end, log(chr1[start:end]), type="l")
}
plotCoverage(chr1, start=1, end=length(chr1)) # Plots coverage result.
# Chr2
plotCoverage <- function(chr2, start, end) { # Defines coverage plotting function.
plot.new()
plot.window(c(start, length(chr1)), c(0, 10))
axis(1, labels=F)
axis(4)
lines(start:end, log(chr2[start:end]), type="l")
}
plotCoverage(chr2, start=1, end=length(chr2)) # Plots coverage result.
# 2nd way of trying with plotLongVector
plotLongVector(chr1, bty="n", ylab="Chr1") # ylab doesn't work
plotLongVector(chr2, bty="n")
然后我有另一种叫做特别感兴趣的基因载体。它们与染色体载体的长度大致相同,但在我的数据中它们包含的值比数值更多。
genes_chr1 <- abs(makeRandomTestData(len=1.3e+07))
genes_chr2 <- abs(makeRandomTestData(len=1e+07))
这些基因载体我想在染色体下绘制成红点!基本上,如果矢量具有那里的值(> 0),则它在长矢量图下呈现为点(或线)。这个我不知道如何添加!但这似乎相当简单。
请帮帮我!非常感谢你。
答案 0 :(得分:4)
免责声明:请不只需复制并粘贴此代码即可运行染色体的整个位置。请抽样位置(例如,如@ Gx1sptDTDa所示)并绘制那些。否则,如果您的计算机在排水管中存活,您可能会在数小时后得到一个巨大的黑色矩形矩形。
使用ggplot2
,使用geom_area
很容易实现。在这里,我为300个位置的三条染色体生成了一些随机数据,只是为了举例说明。我希望你可以建立起来。
# construct a test data with 3 chromosomes and 100 positions
# and random coverage between 0 and 500
set.seed(45)
chr <- rep(paste0("chr", 1:3), each=100)
pos <- rep(1:100, 3)
cov <- sample(0:500, 300)
df <- data.frame(chr, pos, cov)
require(ggplot2)
p <- ggplot(data = df, aes(x=pos, y=cov)) + geom_area(aes(fill=chr))
p + facet_wrap(~ chr, ncol=1)
答案 1 :(得分:1)
您可以使用ggplot2包。
我不确定你到底想要什么,但这就是我的所作所为: 这有7000个随机数据点(实际上染色体1基因数量的两倍左右)。我使用alpha来显示密集区域(这里不是很多,因为它是随机数据)。
library(ggplot2)
Chr1_cov <- sample(1.3e+07,7000)
Chr1 <- data.frame(Cov=Chr1_cov,fil=1)
pl <- qplot(Cov,fil,data=Chr1,geom="pointrange",ymin=0,ymax=1.1,xlab="Chromosome 1",ylab="-",alpha=I(1/50))
print(pl)
就是这样。这发生在不到一秒钟。 ggplot2有大量settings,所以试试吧。使用构面创建多个图形。
下面的代码用于某种移动平均线,然后绘制其输出。它不是真实移动平均线,因为实际移动平均线将具有(几乎)与原始数据点相同数量的数据点 - 它只会使数据更平滑。但是,此代码每n个点取一个平均值。它当然会运行得更快,但你会丢失很多详细的信息。
VeryLongVector <- sample(500,1e+07,replace=TRUE)
movAv <- function(vector,n){
chops <- as.integer(length(vector)/n)
count <- 0
pos <- 0
Cov <-0
pos[1:chops] <- 0
Cov[1:chops] <- 0
for(c in 1:chops){
tmpcount <- count + n
tmppos <- median(count:tmpcount)
tmpCov <- mean(vector[count:tmpcount])
pos[c] <- tmppos
Cov[c] <- tmpCov
count <- count + n
}
result <- data.frame(pos=pos,cov=Cov)
return(result)
}
Chr1 <- movAv(VeryLongVector,10000)
qplot(pos,cov,data=Chr1,geom="line")