Switch to side-by-side view

--- a
+++ b/c_VisualizationScript/Visulz_bulkATAC_trackPlot.R
@@ -0,0 +1,142 @@
+
+# MESSAGE -----------------------------------------------------------------
+#
+# author: Yulin Lyu
+# email: lvyulin@pku.edu.cn
+#
+# require: R whatever
+#
+# ---
+
+# * 1. Load packages ------------------------------------------------------
+
+setwd("exampleData/ATAC")
+
+# grammar
+library(tidyverse)
+library(magrittr)
+library(glue)
+library(data.table)
+
+# graphics
+library(rtracklayer)
+library(ggplot2)
+library(ggsci)
+library(patchwork)
+
+# * 2. Load data ----------------------------------------------------------
+
+transGene <- readRDS("../../data/hg19canonicalTrans.rds") %>% as.data.table()
+transMeta <- readRDS("../../data/hg19trans.rds") %>% as.data.table()
+exonMeta <- readRDS("../../data/hg19exon.rds") %>% as.data.table()
+
+bwFile <- list.files("/mnt/f/exampleData/ATAC/bw", full.names = T)[c(2, 1, 3)]
+sampleName <- str_remove_all(bwFile, ".*/|.bw")
+
+# * 3. Plot ---------------------------------------------------------------
+
+plotTrack <- function(gene = "SP5") {
+  stopifnot(gene %in% transGene$gene_name)
+  
+  trans <- transGene[gene_name == gene, trans_id]
+  chr <- transMeta[tx_name == trans, seqnames] %>% as.vector()
+  startPos <- transMeta[tx_name == trans, start]
+  endPos <- transMeta[tx_name == trans, end]
+  strand <- transMeta[tx_name == trans, strand] %>% as.vector()
+  
+  extend <- max(2000, (endPos - startPos) * 0.05)
+  startEx <- startPos - extend
+  endEx <- endPos + extend
+  
+  exonData <- exonMeta[name == gene]
+  exonData <- exonData[map_lgl(tx_name, ~ {trans %in% .x}), .(start, end)]
+  
+  usedData <- map(bwFile, ~ import.bw(
+    .x, format = "bw", selection = BigWigSelection(GRanges(chr, IRanges(startEx, endEx)))))
+  names(usedData) <- sampleName
+  
+  usedData %<>% map(~ as.data.table(.x))
+  usedData %<>% imap(~ {data.table(sample = .y, pos = .x$start[1]:.x$end[nrow(.x)], value = rep(.x$score, .x$width))})
+  
+  plotData <- purrr::reduce(usedData, rbind)
+  plotData$sample %<>% factor(levels = sampleName)
+  
+  usedColor <- ArchR::ArchRPalettes$stallion %>% unname()
+  
+  g1 <- ggplot(plotData, aes(pos, value)) +
+    geom_area(aes(fill = sample), show.legend = F) +
+    scale_fill_manual(values = usedColor) +
+    labs(y = "Signal intensity") +
+    scale_y_continuous(expand = expansion(c(0, 0.05))) +
+    scale_x_continuous(expand = c(0, 0)) +
+    facet_wrap(~ sample, ncol = 1, strip.position = "right") +
+    theme(
+      aspect.ratio = 1/10,
+      panel.background = element_blank(),
+      panel.grid = element_blank(),
+      panel.border = element_rect(fill = NA),
+      panel.spacing = unit(0, "lines"),
+      strip.background = element_blank(),
+      plot.margin = margin(),
+      axis.ticks.x = element_blank(),
+      axis.text.x = element_blank(),
+      axis.title.x = element_blank()
+    )
+  
+  segmentData <- data.table(
+    start = seq(startPos, endPos, length.out = 10)[2:9]
+  )
+  
+  if(strand == "-") {
+    segmentData[, end := start - 1][]
+  }else{
+    segmentData[, end := start + 1][]
+  }
+  
+  sizeBar <- log10(endPos - startPos) %>% floor() %>% 10^.
+  
+  g2 <- ggplot(exonData) +
+    geom_linerange(x = 0, ymin = startPos, ymax = endPos, size = 0.5) +
+    geom_linerange(aes(x = 0, ymin = start, ymax = end), size = 3) +
+    geom_segment(
+      data = segmentData, aes(y = start, yend = end), x = 0, xend = 0,
+      arrow = arrow(length = unit(.4, "lines")), size = 0.3) +
+    annotate("segment", x = 1, xend = 1, y = endEx - sizeBar, yend = endEx, size = 1.5) +
+    annotate("text", x = 1.2, y = endEx, label = humanFormat(sizeBar), hjust = 1, size = 3) +
+    scale_y_continuous(expand = c(0, 0), limits = c(startEx, endEx)) +
+    scale_x_continuous(expand = expansion(c(.1, .1))) +
+    labs(x = "", y = gene) +
+    coord_flip() +
+    theme(
+      aspect.ratio = 1/10,
+      panel.background = element_blank(),
+      panel.grid = element_blank(),
+      axis.ticks = element_blank(),
+      axis.text = element_blank(),
+      plot.margin = margin()
+    )
+  
+  g1 + g2 + plot_layout(ncol = 1, heights = c(length(sampleName), 1))
+  
+  ggsave(str_c("graphics/", gene, "_track.png"), width = 10, height = length(sampleName) + 1)
+}
+
+humanFormat <- function(n) {
+  stopifnot(is.numeric(n), n > 0)
+  
+  size <- log10(n)
+  
+  if(size < 3) {
+    as.character(n)
+  } else if(size < 6) {
+    paste0(round(n / 1e3), "K")
+  } else if(size < 9) {
+    paste0(round(n / 1e6), "M")
+  } else {
+    paste0(round(n / 1e9), "G")
+  }
+}
+
+plotTrack("SP5")
+plotTrack("CAT")
+