a b/c_VisualizationScript/Visulz_bulkATAC_trackPlot.R
1
2
# MESSAGE -----------------------------------------------------------------
3
#
4
# author: Yulin Lyu
5
# email: lvyulin@pku.edu.cn
6
#
7
# require: R whatever
8
#
9
# ---
10
11
# * 1. Load packages ------------------------------------------------------
12
13
setwd("exampleData/ATAC")
14
15
# grammar
16
library(tidyverse)
17
library(magrittr)
18
library(glue)
19
library(data.table)
20
21
# graphics
22
library(rtracklayer)
23
library(ggplot2)
24
library(ggsci)
25
library(patchwork)
26
27
# * 2. Load data ----------------------------------------------------------
28
29
transGene <- readRDS("../../data/hg19canonicalTrans.rds") %>% as.data.table()
30
transMeta <- readRDS("../../data/hg19trans.rds") %>% as.data.table()
31
exonMeta <- readRDS("../../data/hg19exon.rds") %>% as.data.table()
32
33
bwFile <- list.files("/mnt/f/exampleData/ATAC/bw", full.names = T)[c(2, 1, 3)]
34
sampleName <- str_remove_all(bwFile, ".*/|.bw")
35
36
# * 3. Plot ---------------------------------------------------------------
37
38
plotTrack <- function(gene = "SP5") {
39
  stopifnot(gene %in% transGene$gene_name)
40
  
41
  trans <- transGene[gene_name == gene, trans_id]
42
  chr <- transMeta[tx_name == trans, seqnames] %>% as.vector()
43
  startPos <- transMeta[tx_name == trans, start]
44
  endPos <- transMeta[tx_name == trans, end]
45
  strand <- transMeta[tx_name == trans, strand] %>% as.vector()
46
  
47
  extend <- max(2000, (endPos - startPos) * 0.05)
48
  startEx <- startPos - extend
49
  endEx <- endPos + extend
50
  
51
  exonData <- exonMeta[name == gene]
52
  exonData <- exonData[map_lgl(tx_name, ~ {trans %in% .x}), .(start, end)]
53
  
54
  usedData <- map(bwFile, ~ import.bw(
55
    .x, format = "bw", selection = BigWigSelection(GRanges(chr, IRanges(startEx, endEx)))))
56
  names(usedData) <- sampleName
57
  
58
  usedData %<>% map(~ as.data.table(.x))
59
  usedData %<>% imap(~ {data.table(sample = .y, pos = .x$start[1]:.x$end[nrow(.x)], value = rep(.x$score, .x$width))})
60
  
61
  plotData <- purrr::reduce(usedData, rbind)
62
  plotData$sample %<>% factor(levels = sampleName)
63
  
64
  usedColor <- ArchR::ArchRPalettes$stallion %>% unname()
65
  
66
  g1 <- ggplot(plotData, aes(pos, value)) +
67
    geom_area(aes(fill = sample), show.legend = F) +
68
    scale_fill_manual(values = usedColor) +
69
    labs(y = "Signal intensity") +
70
    scale_y_continuous(expand = expansion(c(0, 0.05))) +
71
    scale_x_continuous(expand = c(0, 0)) +
72
    facet_wrap(~ sample, ncol = 1, strip.position = "right") +
73
    theme(
74
      aspect.ratio = 1/10,
75
      panel.background = element_blank(),
76
      panel.grid = element_blank(),
77
      panel.border = element_rect(fill = NA),
78
      panel.spacing = unit(0, "lines"),
79
      strip.background = element_blank(),
80
      plot.margin = margin(),
81
      axis.ticks.x = element_blank(),
82
      axis.text.x = element_blank(),
83
      axis.title.x = element_blank()
84
    )
85
  
86
  segmentData <- data.table(
87
    start = seq(startPos, endPos, length.out = 10)[2:9]
88
  )
89
  
90
  if(strand == "-") {
91
    segmentData[, end := start - 1][]
92
  }else{
93
    segmentData[, end := start + 1][]
94
  }
95
  
96
  sizeBar <- log10(endPos - startPos) %>% floor() %>% 10^.
97
  
98
  g2 <- ggplot(exonData) +
99
    geom_linerange(x = 0, ymin = startPos, ymax = endPos, size = 0.5) +
100
    geom_linerange(aes(x = 0, ymin = start, ymax = end), size = 3) +
101
    geom_segment(
102
      data = segmentData, aes(y = start, yend = end), x = 0, xend = 0,
103
      arrow = arrow(length = unit(.4, "lines")), size = 0.3) +
104
    annotate("segment", x = 1, xend = 1, y = endEx - sizeBar, yend = endEx, size = 1.5) +
105
    annotate("text", x = 1.2, y = endEx, label = humanFormat(sizeBar), hjust = 1, size = 3) +
106
    scale_y_continuous(expand = c(0, 0), limits = c(startEx, endEx)) +
107
    scale_x_continuous(expand = expansion(c(.1, .1))) +
108
    labs(x = "", y = gene) +
109
    coord_flip() +
110
    theme(
111
      aspect.ratio = 1/10,
112
      panel.background = element_blank(),
113
      panel.grid = element_blank(),
114
      axis.ticks = element_blank(),
115
      axis.text = element_blank(),
116
      plot.margin = margin()
117
    )
118
  
119
  g1 + g2 + plot_layout(ncol = 1, heights = c(length(sampleName), 1))
120
  
121
  ggsave(str_c("graphics/", gene, "_track.png"), width = 10, height = length(sampleName) + 1)
122
}
123
124
humanFormat <- function(n) {
125
  stopifnot(is.numeric(n), n > 0)
126
  
127
  size <- log10(n)
128
  
129
  if(size < 3) {
130
    as.character(n)
131
  } else if(size < 6) {
132
    paste0(round(n / 1e3), "K")
133
  } else if(size < 9) {
134
    paste0(round(n / 1e6), "M")
135
  } else {
136
    paste0(round(n / 1e9), "G")
137
  }
138
}
139
140
plotTrack("SP5")
141
plotTrack("CAT")
142