由于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))
哪个给:
这里的问题已经是我需要自定义图例,这样我一方面只绘制一次(否则它将在每个基因组中重复),但是将包括所有基因组。
然后,我创建系统发育树并将其转换为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())
与我想要的接近,但是我需要帮助的问题是:
谢谢