---
title: "Plot composer"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Plot composer}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
```
```{r setup}
library(ggalign)
```
# align_plots
Special thanks to the `patchwork` project—many core codes of the plot composer
process were adapted from `patchwork`. We have added new features to better
implement `ggalign`'s layout functions (`ggheatmap()` and `ggstack()`),
including:
- `free_align()`
- `free_border()`
- `free_guide()`
- `free_lab()`
- `free_space()`
- `free_vp()`
These features have not been pushed to `patchwork` because they required
significant modification of core code. We attempted to merge them, but the
author of `patchwork` decided to implement some of these features independently.
The latest version of patchwork now includes `free_align()`, `free_lab()`, and
`free_space()` functionality under a single function: `patchwork::free()`. For
more details, see: .
The plot composer function in `ggalign` is `align_plots()`, which behaves
similarly to `cowplot::align_plots()` and `patchwork::wrap_plots()`. However,
you can directly use `align_plots()` with `ggheatmap()` and `ggstack()`,
ensuring that they align correctly by plot panel. Additionally, `align_plots()`
can align `pheatmap` and `ComplexHeatmap` objects, although they won't align by
panel area with ggplot2.
## Plot Assembly
We'll start with a few well-known example plots:
```{r}
p1 <- ggplot(mtcars) +
geom_point(aes(mpg, disp))
p2 <- ggplot(mtcars) +
geom_boxplot(aes(gear, disp, group = gear))
p3 <- ggplot(mtcars) +
geom_bar(aes(gear)) +
facet_wrap(~cyl)
p4 <- ggplot(mtcars) +
geom_bar(aes(carb))
p5 <- ggplot(mtcars) +
geom_violin(aes(cyl, mpg, group = cyl))
```
Either add the plots as single arguments
```{r}
align_plots(p1, p2, p3, p4, p5)
```
Or use bang-bang-bang to add a list of plots
```{r}
align_plots(!!!list(p1, p2, p3), p4, p5)
```
## Empty area
You can use `NULL` to indicate the empty area.
```{r}
align_plots(p1, NULL, p2, NULL, p3, NULL)
```
## Controlling the grid
Like `patchwork`, if no specific layout is provided, `align_plots()` will
attempt to create a grid that is as square as possible, with each column and row
taking up equal space:
```{r}
align_plots(p1, p2, p3, p4, ncol = 3)
```
To adjust the widths of columns, use:
```{r}
align_plots(p1, p2, p3, p4, widths = c(2, 1))
```
## Guide legends
By default, `align_plots()` won't collect any guide legends. You can use the
`guides` argument to control which side of the guide legends should be
collected. They will be collected to their original side. Here, we use
`patch_titles()` to indicate the guide legend position (instead of using
`ggtitle()`). `patch_titles()` can add titles on four sides, and the title will
be placed between the plot panel and the guide legend.
```{r}
p_right <- ggplot(mtcars) +
geom_point(aes(hp, wt, colour = mpg)) +
patch_titles("right") +
labs(color = "right")
p_top <- p_right +
patch_titles("top") +
scale_color_continuous(
name = "top",
guide = guide_colorbar(position = "top")
)
p_left <- p_right +
patch_titles("left") +
scale_color_continuous(
name = "left",
guide = guide_colorbar(position = "left")
)
p_bottom <- p_right +
patch_titles("bottom") +
scale_color_continuous(
name = "bottom",
guide = guide_colorbar(position = "bottom")
)
align_plots(p_right, p_bottom, p_top, p_left, guides = "tlbr")
```
If `align_plots()` is nested in another `align_plots()`, the nested
`align_plots()` will inherit the `guides` argument from the upper-level
`align_plots()`. And the top-level `align_plots()` won't collect guide legends
from plots within the nested `align_plots()` unless the nested `align_plots()`
collects them first.
## free_guide
The `free_guide()` function allows you to override the `guides` argument for a
single plot.
```{r}
align_plots(
free_guide(p_right, NULL),
free_guide(p_bottom, NULL),
free_guide(p_top, NULL),
free_guide(p_left, NULL),
guides = "tlbr"
)
```
You can also specify which guide positions to be collected for individual plots.
```{r}
align_plots(
free_guide(p_right, "r"),
free_guide(p_bottom, "b"),
free_guide(p_top, "t"),
free_guide(p_left, "l")
)
```
## Session information
```{r}
sessionInfo()
```