Skip to content

Commit d4bdec6

Browse files
authored
Merge pull request #16 from m-jahn/colors
improved handling of colors with grouping vs facetting
2 parents 9324901 + 570fd1d commit d4bdec6

File tree

7 files changed

+168
-89
lines changed

7 files changed

+168
-89
lines changed

R/geom_coverage.R

Lines changed: 78 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#' @param data Track prepared by \code{\link{FormatTrack}}.
44
#' @param mapping Set of aesthetic mappings created by \code{aes} or \code{aes_}. Default: NULL.
55
#' @param color Track color. Default: NULL (select automatically).
6-
#' @param rect.color The color of every bin. Default: NA.
6+
#' @param rect.color The color of every bin. Default: NA
77
#' @param single.nuc Logical value, whether to visualize at single nucleotide level (use bar plot). Default: FALSE.
88
#' @param plot.type The type of the plot, choose from facet (separate plot for every sample) and
99
#' joint (combine all sample in a single plot). Default: facet.
@@ -37,20 +37,63 @@
3737
#'
3838
#' @export
3939
#' @examples
40-
#' # library(ggcoverage)
41-
#' # library(utils)
42-
#' # library(ggplot2)
43-
#' # meta.file <- system.file("extdata", "RNA-seq", "meta_info.csv", package = "ggcoverage")
44-
#' # sample.meta <- utils::read.csv(meta.file)
45-
#' # track folder
46-
#' # track.folder <- system.file("extdata", "RNA-seq", package = "ggcoverage")
47-
#' # load bigwig file
48-
#' # track.df <- LoadTrackFile(
49-
#' # track.folder = track.folder, format = "bw",
50-
#' # meta.info = sample.meta
51-
#' # )
52-
#' # ggplot() +
53-
#' # geom_coverage(data = track.df, color = "auto", mark.region = NULL)
40+
#' library(ggcoverage)
41+
#' library(ggplot2)
42+
#'
43+
#' # import track data
44+
#' meta.file <- system.file("extdata", "RNA-seq", "meta_info.csv", package = "ggcoverage")
45+
#' sample.meta <- utils::read.csv(meta.file)
46+
#' track.folder <- system.file("extdata", "RNA-seq", package = "ggcoverage")
47+
#'
48+
#' track.df <- LoadTrackFile(
49+
#' track.folder = track.folder, format = "bw",
50+
#' meta.info = sample.meta
51+
#' )
52+
#'
53+
#' # plot tracks with coloring by 'Group' variable
54+
#' ggplot() +
55+
#' geom_coverage(data = track.df, facet.key = "Type", group.key = "Group")
56+
#'
57+
#' # plot tracks without coloring by any group
58+
#' ggplot() +
59+
#' geom_coverage(data = track.df, facet.key = "Type", group.key = NULL)
60+
#'
61+
#' # plot tracks with coloring each facet differently (facet.key == group.key)
62+
#' ggplot() +
63+
#' geom_coverage(data = track.df, facet.key = "Type", group.key = "Type")
64+
#'
65+
#' # supply your own colors
66+
#' ggplot() +
67+
#' geom_coverage(
68+
#' data = track.df, facet.key = "Type",
69+
#' group.key = "Type", color = 1:4,
70+
#' facet.color = 1:4
71+
#' )
72+
#'
73+
#' # plot tracks together in one panel instead of separately;
74+
#' # 'facet.key' is not needed
75+
#' ggplot() +
76+
#' geom_coverage(
77+
#' data = track.df, group.key = "Type",
78+
#' plot.type = "joint"
79+
#' )
80+
#'
81+
#' # use a custom theme
82+
#' ggplot() +
83+
#' geom_coverage(data = track.df, facet.key = "Type") +
84+
#' theme_bw()
85+
#'
86+
#' # mark a region
87+
#' ggplot() +
88+
#' geom_coverage(
89+
#' data = track.df, facet.key = "Type",
90+
#' mark.region = data.frame(
91+
#' start = c(21678900,21732001,21737590),
92+
#' end = c(21679900,21732400,21737650),
93+
#' label=c("M1", "M2", "M3")),
94+
#' mark.color = grey(0.4)
95+
#' )
96+
#'
5497
geom_coverage <- function(data, mapping = NULL, color = NULL, rect.color = NA,
5598
single.nuc = FALSE, plot.type = c("facet", "joint"),
5699
facet.key = "Type", joint.avg = FALSE, facet.order = NULL,
@@ -67,32 +110,28 @@ geom_coverage <- function(data, mapping = NULL, color = NULL, rect.color = NA,
67110
if (is.null(mapping)) {
68111
if (plot.type == "facet") {
69112
if (!is.null(color)) {
70-
if (length(color) != length(unique(data[, facet.key]))) {
71-
warning("The color you provided is not as long as ", facet.key, " column in data, select automatically!")
113+
testcolors <- sapply(color, function(x) {
114+
tryCatch(is.matrix(col2rgb(x)),
115+
error = function(e) FALSE)
116+
})
117+
if (length(color) < length(unique(data[, group.key]))) {
118+
warning("Fewer colors provided than there are groups in ", group.key, " variable, falling back to default colors")
72119
# sample group with same color
73-
tmp.color <- AutoColor(data = data, n = 9, name = "Set1", key = group.key)
74-
# change facet key color color
75-
if (facet.key == group.key) {
76-
fill.color.df <- merge(unique(data[c(facet.key)]), data.frame(color = tmp.color), by.x = group.key, by.y = 0)
77-
} else {
78-
fill.color.df <- merge(unique(data[c(facet.key, group.key)]), data.frame(color = tmp.color), by.x = group.key, by.y = 0)
79-
}
80-
fill.color <- fill.color.df$color
81-
names(fill.color) <- fill.color.df[, facet.key]
120+
fill.color <- AutoColor(data = data, n = 9, name = "Set1", key = group.key)
82121
} else {
83122
fill.color <- color
84-
if (is.null(names(fill.color))) {
85-
names(fill.color) <- unique(data[, facet.key])
86-
}
123+
}
124+
if (is.null(names(fill.color))) {
125+
names(fill.color) <- unique(data[, group.key])
87126
}
88127
sacle_fill_cols <- scale_fill_manual(values = fill.color)
89128
} else {
90129
sacle_fill_cols <- NULL
91130
}
92131
if (!single.nuc) {
93-
mapping <- aes_string(xmin = "start", xmax = "end", ymin = "0", ymax = "score", fill = facet.key)
132+
mapping <- aes_string(xmin = "start", xmax = "end", ymin = "0", ymax = "score", fill = group.key)
94133
} else {
95-
mapping <- aes_string(x = "start", y = "score", fill = facet.key)
134+
mapping <- aes_string(x = "start", y = "score", fill = group.key)
96135
}
97136
} else if (plot.type == "joint") {
98137
if (!is.null(color)) {
@@ -189,11 +228,13 @@ geom_coverage <- function(data, mapping = NULL, color = NULL, rect.color = NA,
189228
facet.formula <- as.formula(paste0("~ ", facet.key))
190229
if (!single.nuc) {
191230
region.rect <- geom_rect(data = data, mapping = mapping, show.legend = F, colour = rect.color)
231+
ymax.str <- rlang::as_label(mapping$ymax)
192232
} else {
193233
region.rect <- geom_bar(
194234
data = data, mapping = mapping, show.legend = F, colour = rect.color,
195235
stat = "identity"
196236
)
237+
ymax.str <- rlang::as_label(mapping$y)
197238
}
198239
# prepare facet scale
199240
if (facet.y.scale == "free") {
@@ -214,14 +255,14 @@ geom_coverage <- function(data, mapping = NULL, color = NULL, rect.color = NA,
214255
plot.ele <- append(plot.ele, sacle_fill_cols)
215256
}
216257

217-
# add range text to track
218-
ymax.str <- rlang::as_label(mapping$ymax)
219258
if (range.position == "in") {
220259
data.range <- data %>%
221260
dplyr::group_by(.data[[facet.key]]) %>%
222-
dplyr::summarise(max_score = max(.data[[ymax.str]]))
223-
data.range$max_score <- sapply(data.range$max_score, CeilingNumber)
224-
data.range$label <- paste0("[0, ", data.range$max_score, "]")
261+
dplyr::summarise(.groups = "drop_last",
262+
min_score = CeilingNumber(min(.data[[ymax.str]])),
263+
max_score = CeilingNumber(max(.data[[ymax.str]]))
264+
)
265+
data.range$label <- paste0("[", data.range$min_score, ", ", data.range$max_score, "]")
225266
region.range <- geom_text(
226267
data = data.range,
227268
mapping = aes(x = -Inf, y = Inf, label = label),
@@ -310,7 +351,7 @@ geom_coverage <- function(data, mapping = NULL, color = NULL, rect.color = NA,
310351

311352
region.mark <- geom_rect(
312353
data = valid.region.df,
313-
aes_string(xmin = "start", xmax = "end", ymin = "0", ymax = "Inf"),
354+
aes_string(xmin = "start", xmax = "end", ymin = "-Inf", ymax = "Inf"),
314355
fill = mark.color, alpha = mark.alpha
315356
)
316357
plot.ele <- append(plot.ele, region.mark)

R/ggcoverage.R

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,64 @@
4040
#' @export
4141
#'
4242
#' @examples
43-
#' # library(ggcoverage)
44-
#' # library(utils)
45-
#' # library(rtracklayer)
46-
#' # meta.file <- system.file("extdata", "RNA-seq", "meta_info.csv", package = "ggcoverage")
47-
#' # sample.meta <- utils::read.csv(meta.file)
48-
#' # track folder
49-
#' # track.folder <- system.file("extdata", "RNA-seq", package = "ggcoverage")
50-
#' # load bigwig file
51-
#' # track.df <- LoadTrackFile(track.folder = track.folder, format = "bw",region = "chr14:21,677,306-21,737,601",
52-
#' # extend = 2000, meta.info = sample.meta)
53-
#' # gtf.file <- system.file("extdata", "used_hg19.gtf", package = "ggcoverage")
54-
#' # gtf.gr <- rtracklayer::import.gff(con = gtf.file, format = "gtf")
55-
#' # ggcoverage(data = track.df, color = "auto", range.position = "out")
43+
#' library(ggcoverage)
44+
#' library(rtracklayer)
45+
#' library(ggplot2)
46+
#'
47+
#' # import track data
48+
#' meta.file <- system.file("extdata", "RNA-seq", "meta_info.csv", package = "ggcoverage")
49+
#' sample.meta <- read.csv(meta.file)
50+
#' track.folder <- system.file("extdata", "RNA-seq", package = "ggcoverage")
51+
#'
52+
#' track.df <- LoadTrackFile(
53+
#' track.folder = track.folder, format = "bw",
54+
#' region = "chr14:21,677,306-21,737,601",
55+
#' extend = 2000, meta.info = sample.meta
56+
#' )
57+
#'
58+
#' gtf.file <- system.file("extdata", "used_hg19.gtf", package = "ggcoverage")
59+
#' gtf.gr <- rtracklayer::import.gff(con = gtf.file, format = "gtf")
60+
#'
61+
#' # plot tracks with coloring by 'Group' variable
62+
#' ggcoverage(data = track.df, facet.key = "Type", group.key = "Group")
63+
#'
64+
#' # plot tracks without coloring by any group
65+
#' ggcoverage(data = track.df, facet.key = "Type", group.key = NULL)
66+
#'
67+
#' # plot tracks with coloring each facet differently (facet.key == group.key)
68+
#' ggcoverage(data = track.df, facet.key = "Type", group.key = "Type")
69+
#'
70+
#' # supply your own colors
71+
#' ggcoverage(
72+
#' data = track.df, facet.key = "Type",
73+
#' group.key = "Type", color = 1:4,
74+
#' facet.color = 1:4
75+
#' )
76+
#'
77+
#' # plot tracks together in one panel instead of separately;
78+
#' # 'facet.key' is not needed
79+
#' ggcoverage(
80+
#' data = track.df, group.key = "Type",
81+
#' plot.type = "joint"
82+
#' )
83+
#'
84+
#' # use a custom theme
85+
#' ggcoverage(data = track.df, facet.key = "Type") +
86+
#' theme_bw()
87+
#'
88+
#' # mark a region
89+
#' ggcoverage(
90+
#' data = track.df, facet.key = "Type",
91+
#' mark.region = data.frame(
92+
#' start = c(21678900,21732001,21737590),
93+
#' end = c(21679900,21732400,21737650),
94+
#' label=c("M1", "M2", "M3")),
95+
#' mark.color = grey(0.4)
96+
#' )
97+
#'
98+
#' # position range labels outside of tracks
99+
#' ggcoverage(data = track.df, facet.key = "Type", range.position = "out")
100+
#'
56101
ggcoverage <- function(data, single.nuc = FALSE, mapping = NULL, color = NULL,
57102
rect.color = NA, plot.type = c("facet", "joint"), facet.key = "Type", joint.avg = FALSE,
58103
facet.order = NULL, facet.color = NULL, facet.y.scale = c("free", "fixed"),

R/utils.R

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -66,28 +66,21 @@ AutoColor <- function(data, n, name, key) {
6666

6767
# ceiling for number bigger than zero, floor for number smaller than zero
6868
CeilingNumber <- function(x, digits = 2) {
69-
# mark number
70-
if (x < 0) {
71-
flag <- -1
72-
x <- abs(x)
73-
} else {
74-
flag <- 1
75-
}
76-
# transfrom
77-
if (x > 1) {
78-
x.ceiling <- round(x + 5 * 10^(-digits - 1), digits)
79-
} else if (x > 0) {
80-
x.split <- unlist(strsplit(formatC(x, format = "e"), "e"))
81-
num.part <- as.numeric(x.split[1])
82-
sci.part <- as.numeric(x.split[2])
83-
valid.digits <- digits - 1
84-
x.ceiling <- round(num.part + 5 * 10^(-valid.digits - 1), valid.digits) * 10^(sci.part)
69+
if (x == 0) {
70+
"0"
71+
} else if (abs(x) >= 10^6) {
72+
formatC(x, format = "e", digits = 2)
73+
} else if (abs(x) >= 10000) {
74+
formatC(round(x), format = "f", digits = 0)
75+
} else if (abs(x) >= 1) {
76+
if ((x %% floor(x)) != 0) {
77+
formatC(x, format = "f", digits = 2)
78+
} else {
79+
formatC(x, format = "f", digits = 0)
80+
}
8581
} else {
86-
x.ceiling <- 0
82+
formatC(x, format = "f", digits = 2)
8783
}
88-
# final number
89-
x.final <- x.ceiling * flag
90-
return(x.final)
9184
}
9285

9386
# create aa plot dataframe with padding offset

README.Rmd

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,15 @@ The basic coverage plot has **two types**:
122122
#### joint view
123123
Create line plot for **every sample** (`facet.key = "Type"`) and color by **every sample** (`group.key = "Type"`):
124124
```{r basic_coverage_joint, warning=FALSE, fig.height = 4, fig.width = 12, fig.align = "center"}
125-
basic.coverage = ggcoverage(data = track.df, color = "auto",
125+
basic.coverage = ggcoverage(data = track.df,
126126
plot.type = "joint", facet.key = "Type", group.key = "Type",
127127
mark.region = mark.region, range.position = "out")
128128
basic.coverage
129129
```
130130

131131
Create **group average line plot** (sample is indicated by `facet.key = "Type"`, group is indicated by `group.key = "Group"`):
132132
```{r basic_coverage_joint_avg, warning=FALSE, fig.height = 4, fig.width = 12, fig.align = "center"}
133-
basic.coverage = ggcoverage(data = track.df, color = "auto",
133+
basic.coverage = ggcoverage(data = track.df,
134134
plot.type = "joint", facet.key = "Type", group.key = "Group",
135135
joint.avg = TRUE,
136136
mark.region = mark.region, range.position = "out")
@@ -139,22 +139,22 @@ basic.coverage
139139

140140
#### facet view
141141
```{r basic_coverage, warning=FALSE, fig.height = 6, fig.width = 12, fig.align = "center"}
142-
basic.coverage = ggcoverage(data = track.df, color = "auto", plot.type = "facet",
142+
basic.coverage = ggcoverage(data = track.df, plot.type = "facet",
143143
mark.region = mark.region, range.position = "out")
144144
basic.coverage
145145
```
146146

147147
#### Custom Y-axis style
148148
**Change the Y-axis scale label in/out of plot region with `range.position`**:
149149
```{r basic_coverage_2, warning=FALSE, fig.height = 6, fig.width = 12, fig.align = "center"}
150-
basic.coverage = ggcoverage(data = track.df, color = "auto", plot.type = "facet",
150+
basic.coverage = ggcoverage(data = track.df, plot.type = "facet",
151151
mark.region = mark.region, range.position = "in")
152152
basic.coverage
153153
```
154154

155155
**Shared/Free Y-axis scale with `facet.y.scale`**:
156156
```{r basic_coverage_3, warning=FALSE, fig.height = 6, fig.width = 12, fig.align = "center"}
157-
basic.coverage = ggcoverage(data = track.df, color = "auto", plot.type = "facet",
157+
basic.coverage = ggcoverage(data = track.df, plot.type = "facet",
158158
mark.region = mark.region, range.position = "in",
159159
facet.y.scale = "fixed")
160160
basic.coverage
@@ -422,7 +422,7 @@ mark.region
422422

423423
### Basic coverage
424424
```{r basic_coverage_chip, warning=FALSE, fig.height = 6, fig.width = 12, fig.align = "center"}
425-
basic.coverage = ggcoverage(data = track.df, color = "auto",
425+
basic.coverage = ggcoverage(data = track.df,
426426
mark.region=mark.region, show.mark.label = FALSE)
427427
basic.coverage
428428
```

0 commit comments

Comments
 (0)