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).
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With