Управление полями в genoPlotR plot_gene_map - PullRequest
2 голосов
/ 14 марта 2019

Я создаю фигуру plot_gene_map с помощью пакета genoPlotR R, которая дает горизонтальное филогенетическое дерево, в котором выровнен по каждому листу геномный сегмент.

Вот простой пример, который иллюстрирует мое использование и проблему:

Функция plot_gene_map требует ade4 s 'пакета 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);")

Список genoPlotR dna_seg объектов (которые, по сути, data.frame с конкретными столбцами), где имена элементов списка должны совпадать с именами листьев 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")))

И список genoPlotR annotation объектов, которые дают информацию о координатах, также названных в соответствии с 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)

Что дает:

enter image description here

Как видите, имена в верхнем и правом ящиках (генах) обрезаются.

Я пытался играть с pdf width и height, при сохранении рисунка в файл и с полями через par * mar, но они не действуют.

  1. Есть идеи, как отобразить этот график, не обрезая имена?
  2. В настоящее время genoPlotR plot_gene_map не имеет реализованной опции legend. Любая идея, как я могу добавить легенду, скажем, которая показывает эти цвета в квадратах помимо этих меток:

    data.frame (label = c («A», «B», «C», «D», «E»), color = c («красный», «синий», «зеленый», «желтый» », "апельсин"))

1 Ответ

1 голос
/ 23 мая 2019

Рад, что вам нравится genoPlotR.

Нет действительно элегантного решения вашей проблемы, но вот несколько вещей, которые вы можете попробовать: - увеличить annotation_height и уменьшить annotation_cex - увеличить вращение («гниение») вфункция аннотации - используйте xlims для искусственного увеличения длины dna_seg (но это плохой взлом)

В остальном (включая легенду) вам придется использовать grid и его области просмотра.

Смесь первых 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()

Надеюсь, это поможет!

Лайонел

...