R-如何在haploNet haplotyp网络中绘制正确的饼图{pegas} {ape} {adegenet}

时间:2015-07-04 12:24:50

标签: r dna-sequence phylogeny genetics

当使用haploNet软件包在单倍型网络上制作一些图时, 我使用互联网上提供的脚本来做到这一点。不过我觉得有些不对劲。该脚本以woodmouse示例的形式提供。我使用的代码是:

x <- read.dna(file="Masto.fasta",format="fasta")
h <- haplotype(x)
net <- haploNet(h)
plot(net)

plot(net, size = attr(net, "freq"), fast = TRUE)
plot(net, size = attr(net, "freq"))
plot(net, size=attr(net, "freq"), scale.ratio = 2, cex = 0.8

table(rownames(x))

ind.hap<-with(
    stack(setNames(attr(h, "index"), rownames(h))), 
    table(hap=ind, pop=rownames(x)[values])
)
ind.hap 

plot(net, size=attr(net, "freq"), scale.ratio = 2, cex = 0.8, pie=ind.hap)
legend(50,50, colnames(ind.hap), col=rainbow(ncol(ind.hap)), pch=20)

legend(x=7,y=10,c("Baeti ero","Felege weyni","Golgole naele","Hagare selam","Ruba feleg","Ziway"),c("red","yellow","green","turquoise","blue","magenta"))

但是在绘制ind.hap时,您会注意到某些行不在正确的位置。你可以在这里看到:

      pop
hap    Baetiero ETH022 ETH742 Felegeweyni Golgolenaele Rubafeleg
  I           0      0      1           0            0         0
  II          0      1      0           0            0         0
  III         1      0      0           1            0         1
  IV          2      0      0           0            0         3
  IX          0      0      0           1            0         0
  V           4      0      0           0            2         0
  VI          4      0      0           1            0         4
  VII         2      0      0           1            0         0
  VIII        0      0      0           1            0         1
  X           3      0      0           0            1         0
  XI          0      0      0           0            1         1
  XII         0      0      0           1            0         0
  XIII        0      0      0           0            0         1

您可以看到第IX行不在正确的位置。这不会是一个太大的问题,但程序需要第9行来制作IX的饼图,这是VIII的数据。这是结果: (我无法插入图像,因为我的声誉低于10 ...,无论如何你通过执行整个文件得到图像)

你可以看到,对于V直到IX,它不应该是(它们是交换的行)。例如:IX中只有1个单倍型,但是有2个单倍型的饼图(两者都有50%的图表),这是使用VIII数据生成的。由于行按字母顺序排序而不是按升序排序,但这是包装固有的,我不知道该怎么做。 我远离R中的主人,所以尽量不要过于抽象,而是提供代码。

如果有人非常了解这个包装,请解释为什么真正的图表背后有这些奇怪的额外线条(这些带有数字),因为它们在woodmouse示例中不可见(可能是&# 39; s因为什么也错了?)

提前完成

1 个答案:

答案 0 :(得分:4)

我一直在努力解决同样的问题,但我相信我想出了一个解决方案。

问题在于,每个“群体”的单倍型计数table的步骤按字母顺序排列单倍型。因此,例如,单倍型“IX”出现在“V”之前。另一方面,函数haplotype()按其“数字”顺序对单倍型进行排序。这就是在绘图时产生差异的原因。

这可以通过“标签”对单倍型对象进行排序来解决,如?haplotype帮助中所述。

我将使用woodmouse示例数据来举例说明:

# Sample 9 distinct haplotypes
library(pegas)
data(woodmouse)
x <- woodmouse[sample(9, 100, replace = T), ]

为了简化,我创建了一个函数来创建单倍型的计数表(基于this post):

countHap <- function(hap = h, dna = x){
    with(
        stack(setNames(attr(hap, "index"), rownames(hap))),
        table(hap = ind, pop = attr(dna, "dimnames")[[1]][values])
    )
}

现在,让我们看一下没有排序单倍型的结果:

h <- haplotype(x) # create haplotype object
net <- haploNet(h) # create haploNet object

plot(net, pie = countHap(), size = attr(net, "freq"), legend = T)

enter image description here

现在,让我们看看我们的计数表,检查这些结果:

countHap(h, x)

      pop
hap    No0906S No0908S No0909S No0910S No0912S No0913S No304 No305 No306
  I          0       0       0       0       0       0     0     8     0
  II         0       0       0       0       0       0     9     0     0
  III        0       0       0       0       0       0     0     0    10
  IV        16       0       0       0       0       0     0     0     0
  IX         0       0       0       0       0       8     0     0     0
  V          0      12       0       0       0       0     0     0     0
  VI         0       0      10       0       0       0     0     0     0
  VII        0       0       0      13       0       0     0     0     0
  VIII       0       0       0       0      14       0     0     0     0

事情不匹配:例如,单倍型“V”应出现在单个“No0908S”中,而是着色为单个“No0913S”(应该是单倍型“IX”的标签)。

现在,让我们对单倍型进行排序:

h <- haplotype(x)
h <- sort(h, what = "labels") # This is the extra step!!
net <- haploNet(h)

plot(net, pie = countHap(), size = attr(net, "freq"), legend = T)

enter image description here

现在一切都很好!

额外

虽然OP没有要求,但我想把它留在这里,如果其他人感兴趣的话。 有时,我觉得按频率标记单倍型很方便。这可以通过将单倍型标签改变为等于它们的频率来完成:

attr(h, "labels") <- attr(h, "freq")
plot(net, pie = countHap(), size = attr(net, "freq"), legend = T)

enter image description here