Я создаю plot_gene_map рисунок с помощью пакета genoPlotRR, который дает горизонтальное филогенетическое дерево, где с каждым листом выровнен геномный сегмент.
Вот простой пример, который иллюстрирует мое использование и проблему:
Для функции plot_gene_map требуется объект ade4s' package phylog, который представляет филогенетическое дерево:
tree <- ade4::newick2phylog("(((A:0.08,B:0.075):0.028,(C:0.06,D:0.06):0.05):0.0055,E:0.1);")
Список объектов genoPlotRdna_seg (которые по сути являются data.frames с определенными столбцами), где имена элементов списка должны совпадать с именами листьев tree:
dna.segs.list <- list(A=genoPlotR::as.dna_seg(data.frame(name=paste0("VERY.LONG.NAME.A.",1:10),start=seq(1,91,10),end=seq(5,95,10),strand=1,col = "black",ly=1,lwd=1,pch=1,cex=1,gene_type = "blocks",fill = "red")),
B=genoPlotR::as.dna_seg(data.frame(name=paste0("VERY.LONG.NAME.B.",1:10),start=seq(1,91,10),end=seq(5,95,10),strand=1,col = "black",ly=1,lwd=1,pch=1,cex=1,gene_type = "blocks",fill = "blue")),
C=genoPlotR::as.dna_seg(data.frame(name=paste0("VERY.LONG.NAME.C.",1:10),start=seq(1,91,10),end=seq(5,95,10),strand=1,col = "black",ly=1,lwd=1,pch=1,cex=1,gene_type = "blocks",fill = "green")),
D=genoPlotR::as.dna_seg(data.frame(name=paste0("VERY.LONG.NAME.D.",1:10),start=seq(1,91,10),end=seq(5,95,10),strand=1,col = "black",ly=1,lwd=1,pch=1,cex=1,gene_type = "blocks",fill = "yellow")),
E=genoPlotR::as.dna_seg(data.frame(name=paste0("VERY.LONG.NAME.E.",1:10),start=seq(1,91,10),end=seq(5,95,10),strand=1,col = "black",ly=1,lwd=1,pch=1,cex=1,gene_type = "blocks",fill = "orange")))
И список объектов genoPlotRannotation, которые дают информацию о координатах, также названных в соответствии с листьями tree:
annotation.list <- lapply(1:5,function(s){
mids <- genoPlotR::middle(dna.segs.list[[s]])
return(genoPlotR::annotation(x1=mids,x2=NA,text=dna.segs.list[[s]]$name,rot=30,col = "black"))
})
names(annotation.list) <- names(dna.segs.list)
И вызов функции:
genoPlotR::plot_gene_map(dna_segs=dna.segs.list,tree=tree,tree_width=2,annotations=annotation.list,annotation_height=1.3,annotation_cex=0.9,scale=F,dna_seg_scale=F)
Который дает:
Как вы можете видеть, названия верхней и правой рамок (генов) обрезаны.
Я пробовал играть с pdf и width при сохранении рисунка в файл и с полями через heightpar, но они не дают никакого эффекта.
В настоящее время в margenoPlotR не реализована опция plot_gene_map. Любая идея, как я могу добавить легенду, скажем, которая показывает эти цвета в квадратах рядом с этими метками:
data.frame(label = c("A","B","C","D","E"), color = c("красный","синий","зеленый","желтый"," апельсин"))





Рад, что вам нравится genoPlotR.
У вашей проблемы нет действительно элегантного решения, но вот несколько вещей, которые вы можете попробовать: - увеличить annotation_height и уменьшить annotation_cex - увеличить вращение («rot») в функции аннотации - использовать xlims для искусственного увеличения длины dna_seg (но это плохой хак)
Для всего остального (включая легенду) вам придется использовать сетку и ее окна просмотра.
Смесь первых 3 решений:
annotation.list <- lapply(1:5,function(s){
mids <- genoPlotR::middle(dna.segs.list[[s]])
return(genoPlotR::annotation(x1=mids, x2=NA, text=dna.segs.list[[s]]$name,rot=75,col = "black"))
})
names(annotation.list) <- names(dna.segs.list)
genoPlotR::plot_gene_map(dna_segs=dna.segs.list,tree=tree,tree_width=2,annotations=annotation.list,annotation_height=5,annotation_cex=0.4,scale=F,dna_seg_scale=F, xlims=rep(list(c(0,110)),5))
Для лучшего решения с сеткой: (обратите внимание на «plot_new = FALSE» в вызове plot_gene_map)
# changing rot to 30
annotation.list <- lapply(1:5,function(s){
mids <- genoPlotR::middle(dna.segs.list[[s]])
return(genoPlotR::annotation(x1=mids,x2=NA,text=dna.segs.list[[s]]$name,rot=30,col = "black"))
})
names(annotation.list) <- names(dna.segs.list)
# main viewport: two columns, relative widths 1 and 0.3
pushViewport(viewport(layout=grid.layout(1,2, widths=unit(c(1, 0.3), rep("null", 2))), name = "overall_vp"))
# viewport with gene_map
pushViewport(viewport(layout.pos.col=1, name = "geneMap"))
genoPlotR::plot_gene_map(dna_segs=dna.segs.list,tree=tree,tree_width=2,annotations=annotation.list,annotation_height=3,annotation_cex=0.5,scale=F,dna_seg_scale=F, plot_new=FALSE)
upViewport()
# another viewport for the margin/legend
pushViewport(viewport(layout.pos.col=2, name = "legend"))
plotLegend(…)
upViewport()
Надеюсь, это поможет!
Лайонел
Какую функцию или пакет можно использовать для добавления легенды? Базовые функции R мне не подошли. Отображается следующее сообщение:
Error in strheight(legend, units = "user", cex = cex) : plot.new has not been called yet"