Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to plot overlapping ranges with ggplot2

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

enter image description here

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

like image 695
Andreas Avatar asked Feb 02 '14 03:02

Andreas


1 Answers

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

enter image description here

like image 155
Sven Hohenstein Avatar answered Sep 21 '22 21:09

Sven Hohenstein