|
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 |
|