【问题标题】:Overlayed Circular multiple barcharts in RR中的叠加圆形多个条形图
【发布时间】:2012-03-14 03:12:14
【问题描述】:

以下是我的数据:

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)

我想创建多个圆形条形图,其中 x 值 = pos 和 y 值 = v1bar、v2bar、v3bar(所有三个都将在连续的圆圈中)。每个圆圈被划分为 chr。因此每个圆圈都有“饼片”。我不确定这样的图表被称为什么,是否有可能开发一个。下面只是粗略的草图来说明我的想法。

编辑:我的假设在某种程度上类似于以下马戏团人物。

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

编辑:

针对大卫的以下回答,这是我的想象 - chr 不是单独的 circe 而是分类为不同的切片(例如在 circos 图中)

【问题讨论】:

  • rbloggers 在本周早些时候讨论过类似的图表(直方图)CLICK HERE
  • 你想从马戏团人物中具体包括哪些我的回答没有做的事情?
  • 你的图除了 (1) chr 之外的所有特征都是不同的圆圈(而不是 var) - 这显然可以很容易地改变(2)除了不同圆圈中的 var 之外,Chr 是单独的饼图 - circos 图有这个属性
  • 查看我最近添加的内容 - 我认为这正是您想要的。
  • @JohnC:你看我的新答案了吗?

标签: r graph bar-chart


【解决方案1】:

由于您是以圆形方式呈现染色体,请尝试使用 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)

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)

【讨论】:

【解决方案2】:

R/Bioconductor 的OmicCircos 能够绘制重叠的圆形多个条形图。 OmicCircos 的circos 命令接受名为cir 的参数,您可以在其中指定自定义基因组片段或染色体。对于条形图,它具有参数type,您可以在其中指定条形图、箱形图、直方图等之一。

查看Vignette R script - 代码块编号 14:OmicCircos4vignette1 了解更多信息。

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多