Pregunta

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

¿Fue útil?

Solución

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top