将树状图添加到plotly :: subplot图中

时间:2019-03-15 00:14:46

标签: r ggplot2 plotly phylogeny

由于this post似乎没有得到回应,因此我尝试使用R的{​​{1}}自己生成它。

我要做的是绘制几个同源基因组DNA片段,这些片段基本上是水平排列的代表基因的盒子,左边是代表各个基因组物种之间进化关系的系统树。< / p>

这些基因属于几组,并不是每个基因组中都有代表。

以下是plotly中的list,它们代表基因组DNA片段:

data.frame

这是我为所有这些人创建一个情节的方法:

dna.segs.list <- list(data.frame(name=c(paste0("B.",1:3),paste0("C.",1:3)),y=0.2,width=0.75,group=c(rep("B",3),rep("C",3)),stringsAsFactors=F),
                      data.frame(name=c(paste0("A.",1:2),paste0("C.",1:3)),y=0.2,width=0.75,group=c(rep("A",2),rep("C",3)),stringsAsFactors=F),
                      data.frame(name=c(paste0("A.",1:2),"B.1"),y=0.2,width=0.75,group=c(rep("A",2),"B"),stringsAsFactors=F),
                      data.frame(name=c(paste0("B.",1:3),paste0("C.",1:3)),y=0.2,width=0.75,group=c(rep("B",3),rep("C",3))),
                      data.frame(name=paste0("A.",1:3),y=0.2,width=0.75,group=rep("A",3),stringsAsFactors=F))

哪个给:

enter image description here

这里的问题已经是我需要自定义图例,这样我一方面只绘制一次(否则它将在每个基因组中重复),但是将包括所有基因组。

然后,我创建系统发育树并将其转换为x.range <- c(-1,9) dna.segs.plot.list <- lapply(1:length(dna.segs.list),function(s){ dna.seg.df <- dna.segs.list[[s]] dna.seg.df$group <- factor(dna.seg.df$group,levels=c("A","B","C")) dna.seg.plot <- plotly::plot_ly(dna.seg.df,showlegend=s==1) %>% plotly::add_bars(x=~name,y=~y,width=~width,color=~group,colors=c("red","blue","green")) %>% plotly::layout(legend=list(x=1,y=0)) %>% plotly::layout(xaxis=list(title=NA,zeroline=F,tickangle=45,range=x.range),yaxis=list(title=NA,zeroline=F,showgrid=F,range=c(0,1),showticklabels=F)) return(dna.seg.plot) }) dna.segs.plot <- plotly::subplot(dna.segs.plot.list,shareX = F,nrows = length(dna.segs.plot.list)) 对象,以便可以将其添加到ggplot中:

dna.segs.plot

最后,将两者结合使用:

tree.obj <- ape::read.tree(text="(((species1:0.08,species2:0.075):0.028,(species3:0.06,species4:0.06):0.05):0.0055,species5:0.1);")
tree.dend <- dendextend::as.ggdend(phylogram::as.dendrogram.phylo(tree.obj))
leaf.heights <- dplyr::filter(tree.dend$nodes,!is.na(leaf))$height
leaf.xs <- dplyr::filter(tree.dend$nodes,!is.na(leaf))$x
leaf.seqments.idx <- which(tree.dend$segments$yend %in% leaf.heights & tree.dend$segments$x %in% leaf.xs)
tree.dend$segments$yend[leaf.seqments.idx] <- max(tree.dend$segments$yend[leaf.seqments.idx])
tree.dend$segments$col[leaf.seqments.idx] <- "black"
tree.dend$labels$y <- max(tree.dend$segments$yend[leaf.seqments.idx])
tree.dend$labels$x <- tree.dend$segments$x[leaf.seqments.idx]
tree.dend$labels$col <- "black"
tree.dend$segments$lwd <- 0.5
tree.ggdend <- ggplot(tree.dend,labels=F,horiz=T)+guides(fill=F)+coord_flip()+annotate("text",size=4.5,hjust=0,x=tree.dend$label$x,y=tree.dend$label$y,label=tree.dend$label$label)+labs(x="",y="")+theme_minimal()+
  theme(axis.text=element_blank(),axis.ticks=element_blank(),panel.grid=element_blank(),legend.position="none",legend.text=element_blank(),legend.background=element_blank(),legend.key=element_blank())

哪个给我: enter image description here

与我想要的接近,但是我需要帮助的问题是:

  1. 使树梢和DNA片段对齐
  2. 希望树标签不会像现在那样被分支淹没
  3. 如何避免删除图例的---(black,solid,1)(NA,1)部分(我假设它们是由于树而添加的)
  4. 照顾我上面描述的图例问题-让它显示所有组。

谢谢

0 个答案:

没有答案