`vignettes/mixing_plot_frameworks.Rmd`

`mixing_plot_frameworks.Rmd`

All cowplot functions that take plot objects as input
(`ggdraw()`

, `draw_plot()`

,
`plot_grid()`

) can handle several different types of objects
in addition to ggplot2 objects. Most importantly, they can handle plots
produced with base R graphics. However, this functionality is only
available if you have the package gridGraphics
installed.

As the first example, we draw a base graphics plot with
`ggdraw()`

and style the background with the ggplot2 themeing
mechanism.

```
library(ggplot2)
library(cowplot)
# define a function that emits the desired plot
p1 <- function() {
par(
mar = c(3, 3, 1, 1),
mgp = c(2, 1, 0)
)
boxplot(mpg ~ cyl, xlab = "cyl", ylab = "mpg", data = mtcars)
}
ggdraw(p1) +
theme(plot.background = element_rect(fill = "cornsilk"))
```

We can also add a logo to the plot.

```
logo_file <- system.file("extdata", "logo.png", package = "cowplot")
ggdraw() +
draw_image(
logo_file,
x = 1, width = 0.1,
hjust = 1, halign = 1, valign = 0
) +
draw_plot(p1)
```

And we can draw base graphics and ggplot2 graphics side-by-side in a plot grid.

```
p2 <- ggplot(data = mtcars, aes(factor(cyl), mpg)) + geom_boxplot()
plot_grid(p1, p2)
```

Base R plots can be stored in the form of functions that emit the desired plots (demonstrated above), as recorded plots, or using a convenient formula interface.

To create a recorded plot, we first draw the base plot, then we
record it with `recordPlot()`

, and then we can draw it with
`ggdraw()`

.

```
# create base R plot
par(mar = c(3, 3, 1, 1), mgp = c(2, 1, 0))
boxplot(mpg ~ cyl, xlab = "cyl", ylab = "mpg", data = mtcars)
```

```
# record previous base R plot and then draw through ggdraw()
p1_recorded <- recordPlot()
ggdraw(p1_recorded)
```

We can store arbitrarily complex plotting code in formulas by enclosing it into curly braces.

```
# store base R plot as formula
p1_formula <- ~{
par(
mar = c(3, 3, 1, 1),
mgp = c(2, 1, 0)
)
boxplot(mpg ~ cyl, xlab = "cyl", ylab = "mpg", data = mtcars)
}
ggdraw(p1_formula)
```

There is also support for lattice graphics and grid grobs.

```
# base R
p1 <- ~{
par(
mar = c(3, 3, 1, 1),
mgp = c(2, 1, 0)
)
boxplot(mpg ~ cyl, xlab = "cyl", ylab = "mpg", data = mtcars)
}
# ggplot2
p2 <- ggplot(data = mtcars, aes(factor(cyl), mpg)) + geom_boxplot()
# lattice
library(lattice)
p3 <- bwplot(~mpg | cyl, data = mtcars)
# elementary grid graphics objects
library(grid)
p4 <- circleGrob(r = 0.3, gp = gpar(fill = "skyblue"))
# combine all into one plot
plot_grid(p1, p2, p3, p4, rel_heights = c(.6, 1), labels = "auto")
```

Other packages are supported as long as they return grid grobs.

```
library(VennDiagram)
p_venn <- draw.pairwise.venn(
100, 70, 30,
c("First", "Second"),
fill = c("light blue", "pink"),
alpha = c(0.7, 0.7),
ind = FALSE
)
# plot venn diagram and add some margin and enclosing box
ggdraw(p_venn) +
theme(
plot.background = element_rect(fill = NA),
plot.margin = margin(12, 12, 12, 12)
)
```