The bayesplot_grid function makes it simple to juxtapose plots using common \(x\) and/or \(y\) axes.

  plots = list(),
  xlim = NULL,
  ylim = NULL,
  grid_args = list(),
  titles = character(),
  subtitles = character(),
  legends = TRUE,
  save_gg_objects = TRUE



One or more ggplot objects.


A list of ggplot objects. Can be used as an alternative to specifying plot objects via ....

xlim, ylim

Optionally, numeric vectors of length 2 specifying lower and upper limits for the axes that will be shared across all plots.


An optional named list of arguments to pass to gridExtra::arrangeGrob() (nrow, ncol, widths, etc.).

titles, subtitles

Optional character vectors of plot titles and subtitles. If specified, titles and subtitles must must have length equal to the number of plots specified.


If any of the plots have legends should they be displayed? Defaults to TRUE.


If TRUE, the default, then the ggplot objects specified in ... or via the plots argument are saved in a list in the "bayesplots" component of the returned object. Setting this to FALSE will make the returned object smaller but these individual plot objects will not be available.


An object of class "bayesplot_grid" (essentially a gtable object from gridExtra::arrangeGrob()), which has a plot method.


y <- example_y_data()
yrep <- example_yrep_draws()
stats <- c("sd", "median", "max", "min")

 plots = lapply(stats, function(s) ppc_stat(y, yrep, stat = s)),
 titles = stats,
 legends = FALSE,
 grid_args = list(ncol = 1)
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

# \dontrun{
mtcars$log_mpg <- log(mtcars$mpg)
fit1 <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0)
fit2 <- stan_glm(log_mpg ~ wt, data = mtcars, refresh = 0)

y <- mtcars$mpg
yrep1 <- posterior_predict(fit1, draws = 50)
yrep2 <- posterior_predict(fit2, fun = exp, draws = 50)

ppc1 <- ppc_dens_overlay(y, yrep1)

ppc1 + yaxis_text()

ppc2 <- ppc_dens_overlay(y, yrep2)
bayesplot_grid(ppc1, ppc2)

# make sure the plots use the same limits for the axes
bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2))

# remove the legends and add text
bayesplot_grid(ppc1, ppc2, xlim = c(-5, 60), ylim = c(0, 0.2),
               legends = FALSE, subtitles = rep("Predicted MPG", 2))

# }