Creating a simple phylogenetic dendrogram (tree) from a list of species

I want to make a simple phylogenetic tree for a marine biology course as an educational example. I have a list of species with a taxonomic rank:

Group <- c("Benthos","Benthos","Benthos","Benthos","Benthos","Benthos","Zooplankton","Zooplankton","Zooplankton","Zooplankton", "Zooplankton","Zooplankton","Fish","Fish","Fish","Fish","Fish","Fish","Phytoplankton","Phytoplankton","Phytoplankton","Phytoplankton") Domain <- rep("Eukaryota", length(Group)) Kingdom <- c(rep("Animalia", 18), rep("Chromalveolata", 4)) Phylum <- c("Annelida","Annelida","Arthropoda","Arthropoda","Porifera","Sipunculida","Arthropoda","Arthropoda","Arthropoda", "Arthropoda","Echinoidermata","Chorfata","Chordata","Chordata","Chordata","Chordata","Chordata","Chordata","Heterokontophyta", "Heterokontophyta","Heterokontophyta","Dinoflagellata") Class <- c("Polychaeta","Polychaeta","Malacostraca","Malacostraca","Demospongiae","NA","Malacostraca","Malacostraca", "Malacostraca","Maxillopoda","Ophiuroidea","Actinopterygii","Chondrichthyes","Chondrichthyes","Chondrichthyes","Actinopterygii", "Actinopterygii","Actinopterygii","Bacillariophyceae","Bacillariophyceae","Prymnesiophyceae","NA") Order <- c("NA","NA","Amphipoda","Cumacea","NA","NA","Amphipoda","Decapoda","Euphausiacea","Calanioda","NA","Gadiformes", "NA","NA","NA","NA","Gadiformes","Gadiformes","NA","NA","NA","NA") Species <- c("Nephtys sp.","Nereis sp.","Gammarus sp.","Diastylis sp.","Axinella sp.","Ph. Sipunculida","Themisto abyssorum","Decapod larvae (Zoea)", "Thysanoessa sp.","Centropages typicus","Ophiuroidea larvae","Gadus morhua eggs / larvae","Etmopterus spinax","Amblyraja radiata", "Chimaera monstrosa","Clupea harengus","Melanogrammus aeglefinus","Gadus morhua","Thalassiosira sp.","Cylindrotheca closterium", "Phaeocystis pouchetii","Ph. Dinoflagellata") dat <- data.frame(Group, Domain, Kingdom, Phylum, Class, Order, Species) dat 

I would like to get a dendrogram (cluster analysis) and use Domain as the first cutting point, Kindom as the second, Phylum as the third, etc. Missing values ​​should be ignored (instead there is no cutting point, straight line), the Group should be used as a coloring category for labels.

I am a little vague how to make a distance matrix from this data frame. There are many phylogenetic tree packages for R, they seem to want new data / DNA / other extended information. So help with this will be appreciated.

+4
source share
2 answers

Most likely a little lame to answer my own question, but I found an easier solution. Maybe this will help someone.

 library(ape) taxa <- as.phylo(~Kingdom/Phylum/Class/Order/Species, data = dat) col.grp <- merge(data.frame(Species = taxa$tip.label), dat[c("Species", "Group")], by = "Species", sort = F) cols <- ifelse(col.grp$Group == "Benthos", "burlywood4", ifelse(col.grp$Group == "Zooplankton", "blueviolet", ifelse(col.grp$Group == "Fish", "dodgerblue", ifelse(col.grp$Group == "Phytoplankton", "darkolivegreen2", "")))) plot(taxa, type = "cladogram", tip.col = cols) 

Note that all columns must be factors. This demonstrates a workflow with R. It takes a week to find out something, although the code itself is just a couple of lines =)

enter image description here

+3
source

If you want to draw a tree by hand (this is probably not the best way to do this), you can start as follows (this is not a complete answer: the colors are missing and the edges are too long). This assumes the data has already been sorted.

 # Data: remove Group dat <- data.frame(Domain, Kingdom, Phylum, Class, Order, Species) # Start a new plot par(mar=c(0,0,0,0)) plot(NA, xlim=c(0,ncol(dat)+1), ylim=c(0,nrow(dat)+1), type="n", axes=FALSE, xlab="", ylab="", main="") # Compute the position of each node and find all the edges to draw positions <- NULL links <- NULL for(k in 1:ncol(dat)) { y <- tapply(1:nrow(dat), dat[,k], mean) y <- y[ names(y) != "NA" ] positions <- rbind( positions, data.frame( name = names(y), x = k, y = y )) } links <- apply( dat, 1, function(u) { u <- u[ !is.na(u) & u != "NA" ] cbind(u[-length(u)],u[-1]) } ) links <- do.call(rbind, links) rownames(links) <- NULL links <- unique(links[ order(links[,1], links[,2]), ]) # Draw the edges for(i in 1:nrow(links)) { from <- positions[links[i,1],] to <- positions[links[i,2],] lines( c(from$x, from$x, to$x), c(from$y, to$y, to$y) ) } # Add the text text(positions$x, positions$y, label=positions$name) 
+3
source

Source: https://habr.com/ru/post/1403838/


All Articles