在R中叠加圆形多个条形图

jon*_*jon 7 r graph bar-chart

以下是我的数据:

chr <- rep (1:4, each = 200) 

position <- c(1:200, 1:200, 1:200, 1:200)

v1bar <- rnorm(800, 10, 2)

v2bar <- rnorm(800, 10, 2)

v3bar <- rnorm(800, 10, 2)

mydata <- data.frame (chr, position, v1bar, v2bar, v3bar)
Run Code Online (Sandbox Code Playgroud)

我想创建多个圆形条形图,其中x值= pos和y值= v1bar,v2bar,v3bar(所有三个将在连续的圆圈中).每个圆圈被分成chr.因此每个圆圈都有"饼图".我不确定这样的图表是什么,并且可以开发一个.以下只是粗略的草图来说明我的想法.

在此输入图像描述

编辑:我的分歧与下面的马戏团形象相似.

http://circos.ca/tutorials/images/zoom/8.8

EDITS:

回应以下对大卫的回答,这就是我所想象的 - 这不是分开的,而是分类为不同的切片(如在马戏团的身影中) 在此输入图像描述

Dav*_*son 12

由于您以循环方式呈现染色体,请尝试Bioconductor 提供的ecolitk包提供的工具,其中包括在圆形染色体上绘制各种形状的工具.

ETA:这是一个用于创建圆形条形图的示例,尽管它只是划分了您可以用它做的事情的表面.

圆形图

library(ecolitk)

plot.new()
plot.window(c(-5, 5), c(-5, 5))

plot.chrom = function(data, chromlength, radius=1,
                        width=chromlength/length(data), ...) {
    linesCircle(radius, ...)
    starts = seq(1, chromlength - width, width)

    scale = .5 / max(abs(data))
    for (i in 1:length(starts)) {
        polygonChrom(starts[i], starts[i]+width, chromlength, radius,
                data[i] * scale + radius, ...)
    }
}

plot.chrom(rnorm(100, 10, 1), 10000, radius=1)
plot.chrom(rnorm(100, 10, 2), 10000, radius=2, col="blue")
plot.chrom(rnorm(100, 10, 5), 10000, radius=3, col="red")
plot.chrom(rnorm(100, 10, 10), 10000, radius=4, col="green")

legend("topright", legend=c("chr1", "chr2", "chr3", "chr4"),
       col=c("black", "blue", "red", "green"), lty=1)
Run Code Online (Sandbox Code Playgroud)

ETA:啊,现在我明白你对地块划分的意义了.在这种情况下,此代码应该是您正在寻找的.它使用您提供的数据(稍微修改一下 - 我必须给染色体列命名,以便我可以使用ddply)并允许您指定染色体之间的间距.虽然我没有对其进行深入测试,但各种染色体长度以及模拟数据的均值和方差等变化应该如您所愿.

圆形图划分

plot.multi.chrom = function(data, colors, spacing=50) {
    plot.new()
    plot.window(c(-5, 5), c(-5, 5))

    lengths = ddply(data, .(chr), function(x) max(x$position))
    nchrom = NROW(lengths)
    offsets = cumsum(c(0, lengths[, 2])) + cumsum(c(0, rep(spacing, nchrom)))
    tot.length = offsets[length(offsets)] + spacing

    scales = .75 / apply(abs(data[, 3:NCOL(data)]), 2, max)

    for (i in 1:NROW(data)) {
        for (j in 3:NCOL(data)) {
            start = offsets[data[i, 1]] + data[i, 2]
            polygonChrom(start, start + 1, tot.length,
                         j - 2, data[i, j] * scales[j - 2] + j - 2,
                         col=colors[j - 2])
        }
    }
}

chr <- rep (1:4, each = 200) 
position <- c(1:200, 1:200, 1:200, 1:200)
v1bar <- rnorm(800, 10, 2)
v2bar <- rnorm(800, 10, 2)
v3bar <- rnorm(800, 10, 2)
mydata <- data.frame(chr=chr, position, v1bar, v2bar, v3bar)

 require(plyr) 

plot.multi.chrom(mydata, colors=c("red", "black", "green"), spacing=50)

legend("topright", legend=c("V1", "V2", "V3"),
       col=c("red", "black", "green"), lty=1)
Run Code Online (Sandbox Code Playgroud)