How to plot overlapping ranges with ggplot2
bioconductor, ggplot2, plot, r
Solution
Here's a way to produce a similar plot using `ggplot2`. I use the example data of `IRanges`.
library(IRanges)
# example data
ir <- IRanges(c(1, 8, 14, 15, 19, 34, 40),
width = c(12, 6, 6, 15, 6, 2, 7))
# IRanges of length 7
# start end width
# [1] 1 12 12
# [2] 8 13 6
# [3] 14 19 6
# [4] 15 29 15
# [5] 19 24 6
# [6] 34 35 2
# [7] 40 46 7
bins <- disjointBins(IRanges(start(ir), end(ir) + 1))
# [1] 1 2 1 2 3 1 1
dat <- cbind(as.data.frame(ir), bin = bins)
library(ggplot2)
ggplot(dat) +
geom_rect(aes(xmin = start, xmax = end,
ymin = bin, ymax = bin + 0.9)) +
theme_bw()
Problem
I am trying to get my head around `ggplot2`. In particular, I am trying to find out if there is a better (more elegant, simpler) way of creating the plot found in the `Bioconductor` `IRanges` package vignette (found here, figure on page 12, code on page 11). In the vignette, the plot is produced with the following code: ``` plotRanges <- function(x, xlim = x, main = deparse(substitute(x)), + col = "black", sep = 0.5, ...) +{ + height <- 1 + if (is(xlim, "Ranges")) + xlim <- c(min(start(xlim)), max(end(xlim))) + bins <- disjointBins(IRanges(start(x), end(x) + 1)) + plot.new() + plot.window(xlim, c(0, max(bins)*(height + sep))) + ybottom <- bins * (sep + height) - height + rect(start(x)-0.5, ybottom, end(x)+0.5, ybottom + height, col = col, ...) + title(main) + axis(1) +} ir <- IRanges(c(1, 8, 14, 15, 19, 34, 40), + width = c(12, 6, 6, 15, 6, 2, 7)) plotRanges(ir) ``` The fact that the stacked bars are created by drawing rectangles and one has to calculate the corner points, height and width of each rectangle struck me as not very elegant, does `ggplot2` have a more elegant way of doing this? I know 'elegant' is not a very precise description, but I hope you understand what I mean (if not I will try to explain better).