From e171f8178b31bae1f55e9b7f8643d6f2e1ac619a Mon Sep 17 00:00:00 2001 From: Ashton Trey Belew Date: Wed, 13 Aug 2025 16:02:09 -0400 Subject: [PATCH] Added a small function 'GetGeneGroupPadded' to avoid overlapping gene labels. --- R/geom_gene.R | 5 +++-- R/utils.R | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/R/geom_gene.R b/R/geom_gene.R index e707819..4e70394 100644 --- a/R/geom_gene.R +++ b/R/geom_gene.R @@ -223,6 +223,8 @@ ggplot_add.gene <- function(object, plot, object_name) { gene.group.idx <- GetGeneGroup(used.gene.gr, overlap.gene.gap = overlap.gene.gap) } else if (overlap.style == "tight") { gene.group.idx <- GetGeneGroupTight(used.gene.gr, overlap.gene.gap = overlap.gene.gap) + } else if (overlap.style == "padded") { + gene.group.idx <- GetGeneGroupPadded(used.gene.gr, overlap.gene.gap = overlap.gene.gap) } group.num <- length(unique(gene.group.idx)) gene.info.used.gene$group <- gene.group.idx @@ -326,8 +328,7 @@ ggplot_add.gene <- function(object, plot, object_name) { geom_text( data = label.df, mapping = aes_string(x = "pos", y = "group", label = "gene"), - vjust = label.vjust, size = label.size - ) + + vjust = label.vjust, size = label.size) + labs(y = "Gene") + theme_gene( overlap.gene.gap = overlap.gene.gap, group.num = group.num, diff --git a/R/utils.R b/R/utils.R index 64e4d5a..79c9307 100644 --- a/R/utils.R +++ b/R/utils.R @@ -106,6 +106,32 @@ GetGeneGroup <- function(gene.gr, fc = "queryHits", sc = "subjectHits", overlap. return(group.idx) } +GetGeneGroupPadded <- function(gene.gr, fc = "queryHits", sc = "subjectHits", overlap.gene.gap = 1, + padding = 100) { + overlap.gr <- gene.gr + end(overlap.gr) <- end(overlap.gr) + padding + overlap.df <- IRanges::findOverlaps(overlap.gr, overlap.gr, ignore.strand = TRUE) %>% + as.data.frame() %>% + dplyr::arrange(.data[[fc]], .data[[sc]]) + overlap.list <- lapply(split(overlap.df, overlap.df[, fc]), function(x) { + x[, sc] + }) + overlap.list <- overlap.list[order(sapply(overlap.list, length), decreasing = TRUE)] + group.idx <- rep(1, length(unique(overlap.df[, fc]))) + for (i in names(overlap.list)) { + overlap.vec <- overlap.list[[i]] + i <- as.numeric(i) + curr.group <- group.idx[i] + remain.vec <- setdiff(overlap.vec, i) + for (j in remain.vec) { + if (group.idx[j] == curr.group) { + group.idx[j] <- curr.group + overlap.gene.gap + } + } + } + return(group.idx) +} + # place non-overlapping transcripts together GetGeneGroupTight <- function(gene.gr, overlap.gene.gap = 1) { # convert to dataframe