2016-05-03 13 views
0

Ich verwende das ggtree Paket von Bioconductor, um zwei phylogenetische Bäume zu zeichnen. Es funktioniert im Wesentlichen wie ggplot2, und ich möchte die Ästhetik der Tip-Labels so ändern, dass sie mit Klassen übereinstimmt, die durch eine externe CSV-Datei festgelegt wurden.R phylogenetischen Stammbaum mit externen Daten annotieren?

Ich habe ein multiPhylo-Objekt, das zwei verschiedene Gruppierungen der gleichen 50 Gene enthält (wir tun so, als wären es nur 6 für dieses Beispiel). Wenn ich multitree[[1]]$tip.label und multitree[[2]]$tip.label werte, geben sie mir die gleiche Liste in der gleichen Reihenfolge, also weiß ich, dass, während die Diagramme unterschiedlich angezeigt werden, die Gene noch in der gleichen Reihenfolge gespeichert werden.

library(ggtree) 
library(ape) 

mat <- as.dist(matrix(data = rexp(200, rate = 10), nrow = 6, ncol = 6)) 
nj.tree <- nj(mat) ### Package ape 
hclust.tree <- as.phylo(hclust(mat)) 
multitree <- c(nj.tree, hclust.tree) 

Ich mag diese Bäume zeichnen und diese dann mit externen Daten, auf denen von 5 Klassen (A, B, C, D und E) sind sie nach der bestehenden Literatur basieren annotieren.

write.csv(multitree[[1]]$tip.label, "Genes.csv") 

benutzen ich diesen Befehl eine CSV-Datei von jedem der Gene in der richtigen Reihenfolge (nicht sicher, ob das relevant ist) zu erstellen. Ich habe dann den entsprechenden Klassenbuchstaben in der Spalte, die zu jedem Gen passt, manuell eingegeben. Es sieht in etwa so aus:

Gene Class 
1  A 
2  A 
3  D 
4  C 
5  B 
6  E 

Und so weiter.

Ich möchte die Farben der Tippetiketten in meinem Baum mit den in meiner externen CSV-Tabelle definierten Farben annotieren. Ich weiß, dass es ungefähr wie geom_tiplab(aes(color=something something something)) aussehen würde, aber ich weiß nicht, wie man es so macht, dass es die Daten innerhalb meiner CSV und nicht die Daten innerhalb der multitree liest. So sieht mein ggtree-Befehl aus:

myTree <- ggtree(multitree[[i]], aes(x, y)) + 
    ggtitle(names(multitree)[i]) + 
    geom_tiplab() + ### What I want to annotate with color 
    theme_tree2() + 
    coord_fixed(ratio = 0.5) 
print(myTree)   ###Occurs within a for loop, forces ggplot output to display 
+0

Wie entsprechen die Werte im CSV-Dateibeispiel (Gene, Klasse) den Werten in 'multitree [[1]] $ tip.label'? Es gibt keine entsprechenden Werte zwischen ihnen. – eipi10

+0

Die Gen-Namen aus der CSV-Datei werden direkt aus den tip.label-Namen gedruckt. Das heißt, sie haben den Namen order und gleiche Namen. Gibt es eine andere Möglichkeit, extern Informationen hinzuzufügen, zu welcher Klasse jedes Gen gehört? –

+0

In Ihrem Beispiel hat 'multitree [[1]] $ tip.label' die Werte 1 bis 50. In Ihrem CSV-Beispiel gibt es keine solchen Werte. Wie also ermittelt man, welches' tip.label' zu welcher Zeile in der CSV-Datei? Es wäre auch hilfreich, wenn Sie ein viel kleineres Beispiel, zB 5 oder 6 Tip-Labels, erstellt hätten und dann einen Datenrahmen mit (analog zu Ihrer CSV-Datei) erstellt hätten, der 'tip.label' mit' Class' übereinstimmt (was ist? es scheint, als ob du versuchst zu tun – eipi10

Antwort

0

Erstellen Sie einen Farbvektor für die Klassennamen aus Ihrer Tabelle.

g <- read.csv("Genes.csv") 
cols <- rainbow(nlevels(g$Class)) 

# Function to identify class color for a certain gene 
findCol <- function(x){ 
    col <- switch(as.character(x), A=cols[1], B=cols[2], C=cols[3], D=cols[4], E=cols[5]) 
    return(col) 
} 
col.vect <- sapply(g$Class, findCol) 

Verwenden Sie diesen Vektor in Ihrer geom_tiplab() Funktion.

+1

Hallo, danke! Ich habe tatsächlich einen anderen Weg gefunden, es zu tun, mit dem '% <+%' Operator im Paket 'ggtree' von Bioconductor.Es erlaubt mir zu verknüpfen eine externe Datei in meinen bestehenden ggplot und manipuliere dann meine Grafiken mit dieser externen Tabelle. Vielen Dank! –