Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combination Boxplot and Histogram using ggplot2

Tags:

I am trying to combine a histogram and boxplot for visualizing a continuous variable. Here is the code I have so far

require(ggplot2) require(gridExtra) p1 = qplot(x = 1, y = mpg, data = mtcars, xlab = "", geom = 'boxplot') +       coord_flip() p2 = qplot(x = mpg, data = mtcars, geom = 'histogram') grid.arrange(p2, p1, widths = c(1, 2)) 

plot

It looks fine except for the alignment of the x axes. Can anyone tell me how I can align them? Alternately, if someone has a better way of making this graph using ggplot2, that would be appreciated as well.

like image 883
Ramnath Avatar asked Dec 29 '10 04:12

Ramnath


People also ask

What is a combination histogram and boxplot?

WHAT ARE HISTOGRAMS AND BOX PLOTS?. Histograms are a special kind of bar graph that shows a bar for a range of data values instead of a single value. A box plot is a data display that draws a box over a number line to show the interquartile range of the data.

How do you make a histogram and a boxplot in R?

A histogram can be created in R with the hist function. By default a frequency histogram will be created, but you can create a density histogram setting prob = TRUE . A box plot can be created with the boxplot function.

Can you build a histogram using ggplot2?

You can also make histograms by using ggplot2 , “a plotting system for R, based on the grammar of graphics” that was created by Hadley Wickham. This post will focus on making a Histogram With ggplot2.


1 Answers

you can do that by coord_cartesian() and align.plots in ggExtra.

library(ggplot2) library(ggExtra) # from R-forge  p1 <- qplot(x = 1, y = mpg, data = mtcars, xlab = "", geom = 'boxplot') +    coord_flip(ylim=c(10,35), wise=TRUE) p2 <- qplot(x = mpg, data = mtcars, geom = 'histogram') +    coord_cartesian(xlim=c(10,35), wise=TRUE)  align.plots(p1, p2) 

Here is a modified version of align.plot to specify the relative size of each panel:

align.plots2 <- function (..., vertical = TRUE, pos = NULL)  {     dots <- list(...)     if (is.null(pos)) pos <- lapply(seq(dots), I)     dots <- lapply(dots, ggplotGrob)     ytitles <- lapply(dots, function(.g) editGrob(getGrob(.g,          "axis.title.y.text", grep = TRUE), vp = NULL))     ylabels <- lapply(dots, function(.g) editGrob(getGrob(.g,          "axis.text.y.text", grep = TRUE), vp = NULL))     legends <- lapply(dots, function(.g) if (!is.null(.g$children$legends))          editGrob(.g$children$legends, vp = NULL)     else ggplot2:::.zeroGrob)     gl <- grid.layout(nrow = do.call(max,pos))     vp <- viewport(layout = gl)     pushViewport(vp)     widths.left <- mapply(`+`, e1 = lapply(ytitles, grobWidth),          e2 = lapply(ylabels, grobWidth), SIMPLIFY = F)     widths.right <- lapply(legends, function(g) grobWidth(g) +          if (is.zero(g))              unit(0, "lines")         else unit(0.5, "lines"))     widths.left.max <- max(do.call(unit.c, widths.left))     widths.right.max <- max(do.call(unit.c, widths.right))     for (ii in seq_along(dots)) {         pushViewport(viewport(layout.pos.row = pos[[ii]]))         pushViewport(viewport(x = unit(0, "npc") + widths.left.max -              widths.left[[ii]], width = unit(1, "npc") - widths.left.max +              widths.left[[ii]] - widths.right.max + widths.right[[ii]],              just = "left"))         grid.draw(dots[[ii]])         upViewport(2)     } } 

usage:

# 5 rows, with 1 for p1 and 2-5 for p2 align.plots2(p1, p2, pos=list(1,2:5)) # 5 rows, with 1-2 for p1 and 3-5 for p2 align.plots2(p1, p2, pos=list(1:2,3:5)) 

align.plots2 second example

like image 143
kohske Avatar answered Oct 30 '22 14:10

kohske