Добавьте дендрограмму к графику plotly :: subplot - PullRequest
1 голос
/ 15 марта 2019

Поскольку этот пост , похоже, не отвечает, я попытался сгенерировать его сам, используя R s plotly.

То, что я пытаюсь сделать, это построить несколько гомологичных сегментов геномной ДНК, которые по существу представляют собой горизонтально расположенные прямоугольники, которые представляют гены, а слева от них - филогенетическое древо, которое представляет эволюционные отношения между видами соответствующих геномов.

Гены принадлежат нескольким группам, не все представлены в каждом геноме.

Вот list из data.frame s, которые представляют сегменты геномной ДНК:

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))

Что дает:

enter image description here

Проблема здесь уже заключается в том, что мне нужно настроить легенду так, чтобы я наносил ее только с одной стороны (иначе она будет повторяться для каждого генома), но включал бы все генные группы.

Затем я создаю филогенетическое дерево и преобразую его в 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())

И, наконец, для объединения двух я использую:

dna.segs.tree.plot <- plotly::subplot(tree.ggdend,plotly::plotly_empty(),dna.segs.plot %>% plotly::layout(showlegend=T),nrows=1,margin=c(0,0,0,0),widths=c(0.39,0.02,0.59))

Что дает мне: enter image description here

Что близко к тому, что я хочу, но мне нужна помощь по следующим вопросам:

  1. Выравнивание кончиков дерева и сегментов ДНК
  2. Мотыга, чтобы ветви дерева не пересекали ветви, как сейчас
  3. Как избежать отключения --- (черных, сплошных, 1) (NA, 1) частей легенды (я предполагаю, что они добавляются из-за дерева)
  4. Забота о проблеме легенды, которую я описал выше - заставить ее показать все группы

Спасибо

...