Как раскрасить ветви дерева без корней с помощью переменной в R_II

Я хотел бы раскрасить ветви для определенных меток в некорневом соседе, соединяющем деревья из входных данных гаплотипа. Эти два примера из akang и Уилл Хэмилтон. Они пытались ответить на этот вопрос, но ответы не соответствовали правильным цветам для определенных этикеток.

Первый пример. Здесь мы хотим раскрасить три группы из фрейма данных 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])

Проблема: образцы из каждой группы не окрашены должным образом. Некоторые образцы из разных групп имеют одинаковый цвет (т. Е. Одинаковый цвет для образцов из разноцветного и вирджинского)

Второй пример из Уилл Гамильтон. Мы хотим, чтобы 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 должны быть оранжевыми (то есть это а), но на графике E синего цвета. C оранжевый, но это b (должен быть синим). Я хочу, чтобы A, B, E = оранжевый; C, D, F = синий.

По сути, я хочу иметь возможность назначать цвета каждому краю из определенных меток. Это возможно?


person Javier_HV    schedule 27.06.2020    source источник
comment
Осмотрите ?ape:::plot.phylo(). Это основной метод при вызове plot объекта "phylo".   -  person jay.sf    schedule 27.06.2020
comment
Да, функция edge.color предназначена для окраски краев. В качестве второго примера следует phylo_nj$edge order. Проблема в том, что phylo_nj $ edge имеет 9 строк для всех ребер, но есть 6 меток (SNP_A, B, C, D, E, F). Вы знаете, как связать эти два набора данных? Я пробовал два разных метода, но ничего не вышло. Спасибо   -  person Javier_HV    schedule 30.06.2020
comment
Боюсь, что на данный момент я недостаточно знаком с этим методом, чтобы помочь вам.   -  person jay.sf    schedule 30.06.2020