Масштаб радиуса изменения ggtree

Я пытаюсь создать филогенетическое дерево с помощью ggtree. У меня возникают проблемы с изменением размера центра дерева, чтобы символы на ребре, представляющие мои последовательности, не перекрывали друг друга и увеличивали радиус, чтобы длина ветвей не была такой длинной. Любые советы или советы о том, как это сделать, будут высоко оценены. Заранее спасибо!

Я использую следующий скрипт для создания дерева...

ggtree(PhyMLAATree, layout = "circular") + 
    geom_tippoint(aes(x=x+.01), shape=Shape, fill=Fill, size=3)

Эти два изображения показывают, что я создаю и что я пытаюсь создать. Дерево выглядит следующим образом: Вот так выглядит вывод

Хотелось бы, чтобы итоговое дерево выглядело так с гораздо большим центром: Вот как бы я хотел, чтобы дерево выглядело

Я попытался выделить устройство с большим пространством, но я получил те же пропорции на дереве (кварц (ширина =12, высота =12)

1 ответ

В моем подходе я воссоздал длины ребер, следуя отрицательному экспоненциальному распределению от внутренних к внешним ребрам по иерархическим уровням.

library(ggtree) # install as in:
#source("https://bioconductor.org/biocLite.R")
#biocLite("ggtree")  
library(data.tree)
library(gridExtra)
library(rlist)
library(phangorn)

#create random tree
tree<-ape::rtree(251)
#its plot
originalplot<-ggtree(tree, layout="circular")+ geom_tiplab2() + labs(title="original tree") +
  theme(plot.title = element_text(hjust = 0.5))

transformtree<-function(tree,radialparameter,repeatparameter,tiplength){
  # radialparameter # # change this to collapse less(0.5) or more (3) and modify repeatparameter together
  # repeatparameter # # i.e. increase if there are very small branches (levels)
  #number of hierarchical levels in tree
  dfr0<-as.data.frame(tree$edge)
  tree2<-FromDataFrameNetwork(dfr0)# data.tree package
  levels<-ToDataFrameTable(tree2, "level")
  edgelevels<-max(levels)-1
  # establish the hierarchy of nodes looking for the children of the children nodes
  centralnode<-getMRCA(tree,1:length(tree$tip.label))
  childrenlist<-list()
  childrenlist[1]<-list(phangorn::Children(tree, centralnode))
  for (i in 2:edgelevels){
    childrenlist[i]<- list(unlist(lapply(unlist(childrenlist[i-1]), function(x) phangorn::Children(tree, x) ) ) )
  }
  # remove nodes of tips, we do not want to modify their length
  childrentipsremoved<-lapply(childrenlist, function(x) x[!is.element(x,1:length(tree$tip.label))])
  # list of inner nodes
  groupedinnernodes<-rlist::list.clean(childrentipsremoved, fun = function(x) length(x) == 0L)
  #this is the vector that will multiply the inner edges
  transfvector<- rep(((c(1:(length(groupedinnernodes)/repeatparameter))^(-radialparameter) )*5),
                     each=repeatparameter) 
  # check length of groups of inner nodes and the transformation vector
  lengths<-unlist(lapply(groupedinnernodes, function(x) length(x)) )
  if(length(lengths)-length(transfvector)>0) {
    for (i in 1:abs(length(lengths)-length(transfvector) )   ){
      transfvector <- c(transfvector,transfvector[length(transfvector)]) 
    } }
  if(length(lengths)-length(transfvector)<0) {
    for (i in 1:abs(length(lengths)-length(transfvector) )   ){
      transfvector <- transfvector[-1] }}
  # create the factor to transform the inner edges
  vector1<-unlist(mapply(rep, transfvector,lengths) )
  # discard length info, replace all edge length information by 1
  size<-length(tree$edge.length)
  tree$edge.length<-rep(1,size)
  # replace edge length for the connecting inner nodes only
  innernodes<-unlist(groupedinnernodes)
  tree$edge.length[unlist(lapply(innernodes,function(x,y) which(y==x),y=tree$edge[,2]) )]<-
    tree$edge.length[unlist(lapply(innernodes,function(x,y) which(y==x),y=tree$edge[,2]) )]*
    vector1
  # modify length of tip edges # optional decrease for big trees
  tree$edge.length[tree$edge.length==1]<-tiplength
  return(tree)
}

tree<-transformtree(tree,2.5,2,0.2)
# plot of modified tree aligned tips
newplot<-ggtree(tree, layout="circular")+ geom_tiplab2(align=T,linetype=1, linesize=.02, 
                                                       size=1.8, offset=0.5) + labs(title="modified tree align=T")+
  theme(plot.title = element_text(hjust = 0.5))

# plot of modified tree not aligned tips
newplot2<-ggtree(tree, layout="circular")+ geom_tiplab2(align=F,linetype=1, linesize=.02, 
                                                        size=1.8, offset=0.5) + labs(title="modified tree align=F")+
  theme(plot.title = element_text(hjust = 0.5))

#plots
gridExtra::grid.arrange(originalplot,newplot,newplot2,ncol=2)

Это можно сделать, указав xlim с участием layout = "circular", как это:

nwk <- system.file("extdata", "sample.nwk", package="treeio")
tree <- read.tree(nwk)

library(ggtree)

ggtree(tree, layout = "circular") +
  geom_tippoint() +
  geom_tiplab2(offset = 7) +
  xlim(-150, NA)

Как описано в документации ggtree на рис. 4.3. Поиграйте сxlim значение, чтобы изменить диаметр центра.

Другие вопросы по тегам