/
Visulz_bulkATAC_trackPlot.R
142 lines (113 loc) · 4.29 KB
/
Visulz_bulkATAC_trackPlot.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# 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")