Как раскрасить ветви дерева без корней, используя переменную в R - PullRequest
2 голосов
/ 18 февраля 2020

Я хотел бы сгенерировать необработанные соседние деревья, соединяющие деревья, из входных данных гаплотипа, а затем раскрасить ветви деревьев на основе переменной. Я использую пакеты Ape и ggtree. Гаплотипы и дополнительные переменные (метаданные) находятся в двух отдельных файлах с соответствующими именами образцов. Мне удалось создать деревья и раскрасить кончики деревьев по переменным, но не по ветвям дерева.

Использование фиктивных данных -

# Packages
library('ggplot2')
library('ape')
library('phangorn')
library('dplyr')
library('ggtree')
library('phylobase')

# Generate haplotype dataframe
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

# Metadata
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

# Generate Euclidian pairwise distance matrix
pdist = dist(as.matrix(df), method = "euclidean")

# Turn pairwise distance matrix into phylo via neighbour joining method
phylo_nj <- nj(pdist)

Я могу построить дерево в Ape:

# Example tree plot using Ape
plot(unroot(phylo_nj),
     type="unrooted",
     cex=1,
     use.edge.length=TRUE,
     show.tip.label = TRUE,
     lab4ut="axial",
     edge.width=1.5)

И я могу построить дерево в ggtree, добавив переменные к точкам наконечника по цвету / форме:

# Plotting in ggtree
mytree <- ggtree(phylo_nj, layout="equal_angle", size=0.5, linetype=1)
mytree

# Adding metadata variables to tree plot
mytree2 <- mytree %<+% df2 + geom_tippoint(aes(shape = Factor_A,
                                               colour = Factor_B),
                                               size = 9,
                                           alpha=0.7)
mytree2

Но я не могу понять, как сделать ветви цветными с помощью переменной (а не точек наконечника), либо в Ape, либо в ggtree. Я хочу, чтобы окрашивались только конечные ветви, а не все линии дерева. Моя цель - отобразить две (категориальные) переменные - одну по цвету ветви, а другую по форме (или цвету) кончика. Грубая версия того, что мне нужно, будет выглядеть примерно так, как показано на рисунке ниже (с Factor_A, закодированным по форме кончика (нейтральный цвет, как показано) и Factor_B, закодированным с помощью цвета ветви.

enter image description here

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 19 февраля 2020

Вы можете использовать функцию ape::edges после того, как построите дерево, используя ape::plot.phylo для раскраски, задавая c ребра, задав начальный / конечный узел, делающий ребро цветом.

## Colouring the first edge with a red dashed line
plot(unroot(phylo_nj), type = "unrooted")
edges(7, 8, col = "red", lty = 2)

Или Вы можете указать вектор цветов непосредственно в функции ape::plot.phylo:

## Making rainbow edges
plot(unroot(phylo_nj), type = "unrooted", edge.color = rainbow(9))

Вы можете узнать, какие ребра нужно окрашивать в вашем фрейме данных, используя таблицу ребер в объекте phylo (phylo_nj$edge). Например:

## Which labels have level "a"
labels_a <- df2$Factor_A %in% "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])

Конечно, вы можете расширить это до нескольких уровней, следуя этому методу, чтобы определить, какое ребро приводит к острию с любым уровнем фактора.

...