0

我想为来自输入单倍型数据的无根邻居连接树中的特定标签着色分支。提供了akangWill Hamilton的这两个例子。他们试图解决这个问题,但答案与定义标签的正确颜色不匹配。

第一个例子。在这里,我们要为相邻连接树中的 Iris 数据帧(setosa、versicolor、virginica)中的三个组着色。我包括 rownames(Iris) 来为每个样本定义一个名称,以便识别图中的样本

library(ape)
head(iris)
prefix <- "Sample"
suffix <- seq(1:150)
Sample <- paste(prefix,suffix, sep ="."); Sample
iris$Sample <- Sample
rownames(iris) <- iris$Sample

D <-dist(as.matrix(iris[, 1:4]))
tree <- nj(D)
str(tree)
plot(tree, type = "unr", show.tip.lab = TRUE, cex=0.3, font=1, 
     edge.col=c("red","green","blue")[iris$Species])

问题:每组的样本没有正确着色。来自不同组的一些样本具有相同的颜色(即来自 versicolor 和 virginica 的样本颜色相同)

Will Hamilton的第二个例子。我们希望 Sample_A、Sample_B 和 Sample_E 基于单倍型矩阵具有相同的橙色。

Sample <- c('Sample_A', 'Sample_B', 'Sample_C', 'Sample_D', 'Sample_E', 'Sample_F')
SNP_A <- c(0, 1, 1, 0, 1, 1)
SNP_B <- c(0, 1, 1, 0, 1, 1)
SNP_C <- c(0, 0, 1, 1, 1, 0)
SNP_D <- c(1, 1, 0, 0, 1, 0)
SNP_E <- c(0, 0, 1, 1, 0, 1)
SNP_F <- c(0, 0, 1, 1, 0, 1)
df = data.frame(Sample, SNP_A, SNP_B, SNP_C, SNP_D, SNP_E, SNP_F, row.names=c(1))
df

pdist = dist(as.matrix(df), method = "euclidean") #Euclidean distance
phylo_nj <- nj(pdist)#neighbour joining method

#Sample samples but adding some information for each sample
Factor_A <- c('a', 'a', 'b', 'c', 'a', 'b')
Factor_B <- c('d', 'e', 'd', 'd', 'e', 'd')
df2 = data.frame(Sample, Factor_A, Factor_B)
df2

labels_a <- df2$Factor_A %in% "a" #logical vector finding "a" in Factor A
## Which edges connect to these labels?
edge_a <- phylo_nj$edge[,2] %in% match(phylo_nj$tip.label, df2$Sample[labels_a])
## Plotting the factors with the labels a coerced as numeric
plot(unroot(phylo_nj), type = "unrooted", edge.color = c("blue", "orange")[edge_a+1])

问题:第二个例子不能正常工作。样本 A、B 和 E 应该是橙色的(即它们是“a”),但在图中,E 是蓝色的。C 是橙色但是“b”(应该是蓝色)。我想要 A,B,E = 橙色;C、D、F = 蓝色。

基本上,我希望能够为特定标签的每个边缘分配颜色。这可能吗?

4

0 回答 0