Both patchwork and cowplot define functions align_plots(), which fundamentally do the same thing but using quite different APIs and approaches. For the immediate future, I don't see a way of unifying them. I also think it will be quite confusing for the two packages to both define this function, since both packages will quite often be loaded at the same time (e.g., if people want to use the cowplot themes).
Since cowplot::align_plots() has been on CRAN for a while, and there's definitely code floating around using it (see e.g. here), would it be possible to rename the patchwork function and quickly re-release on CRAN? Maybe rename to justify_plots() or align_plot_panels()?
patchwork::align_plots
#> function (...)
#> {
#> if (is.ggplot(..1)) {
#> plots <- list(...)
#> }
#> else if (is.list(..1)) {
#> plots <- ..1
#> }
#> else {
#> stop("Can only align ggplot objects or a list of them",
#> call. = FALSE)
#> }
#> lapply(plots, set_dim, get_max_dim(plots))
#> }
#> <bytecode: 0x7f9396fbbc00>
#> <environment: namespace:patchwork>
cowplot::align_plots
#> function (..., plotlist = NULL, align = c("none", "h", "v", "hv"),
#> axis = c("none", "l", "r", "t", "b", "lr", "tb", "tblr"),
#> greedy = TRUE)
#> {
#> plots <- c(list(...), plotlist)
#> num_plots <- length(plots)
#> grobs <- lapply(plots, function(x) {
#> if (!is.null(x))
#> as_gtable(x)
#> else NULL
#> })
#> halign <- switch(align[1], h = TRUE, vh = TRUE, hv = TRUE,
#> FALSE)
#> valign <- switch(align[1], v = TRUE, vh = TRUE, hv = TRUE,
#> FALSE)
#> vcomplex_align <- hcomplex_align <- FALSE
#> if (valign) {
#> num_widths <- unique(lapply(grobs, function(x) {
#> length(x$widths)
#> }))
#> num_widths[num_widths == 0] <- NULL
#> if (length(num_widths) > 1 || length(grep("l|r", axis[1])) >
#> 0) {
#> vcomplex_align = TRUE
#> if (axis[1] == "none") {
#> warning("Graphs cannot be vertically aligned unless the axis parameter is set. Placing graphs unaligned.",
#> call. = FALSE)
#> valign <- FALSE
#> }
#> max_widths <- lapply(grobs, function(x) {
#> x$widths
#> })
#> if (length(grep("l", axis[1])) > 0) {
#> max_widths <- align_margin(max_widths, "first",
#> greedy = greedy)
#> }
#> if (length(grep("r", axis[1])) > 0) {
#> max_widths <- align_margin(max_widths, "last",
#> greedy = greedy)
#> }
#> }
#> else {
#> max_widths <- list(do.call(grid::unit.pmax, lapply(grobs,
#> function(x) {
#> x$widths
#> })))
#> }
#> }
#> if (halign) {
#> num_heights <- unique(lapply(grobs, function(x) {
#> length(x$heights)
#> }))
#> num_heights[num_heights == 0] <- NULL
#> if (length(num_heights) > 1 || length(grep("t|b", axis[1])) >
#> 0) {
#> hcomplex_align = TRUE
#> if (axis[1] == "none") {
#> warning("Graphs cannot be horizontally aligned unless the axis parameter is set. Placing graphs unaligned.",
#> call. = FALSE)
#> halign <- FALSE
#> }
#> max_heights <- lapply(grobs, function(x) {
#> x$heights
#> })
#> if (length(grep("t", axis[1])) > 0) {
#> max_heights <- align_margin(max_heights, "first",
#> greedy = greedy)
#> }
#> if (length(grep("b", axis[1])) > 0) {
#> max_heights <- align_margin(max_heights, "last",
#> greedy = greedy)
#> }
#> }
#> else {
#> max_heights <- list(do.call(grid::unit.pmax, lapply(grobs,
#> function(x) {
#> x$heights
#> })))
#> }
#> }
#> for (i in 1:num_plots) {
#> if (!is.null(grobs[[i]])) {
#> if (valign) {
#> if (vcomplex_align) {
#> grobs[[i]]$widths <- max_widths[[i]]
#> }
#> else {
#> grobs[[i]]$widths <- max_widths[[1]]
#> }
#> }
#> if (halign) {
#> if (hcomplex_align) {
#> grobs[[i]]$heights <- max_heights[[i]]
#> }
#> else {
#> grobs[[i]]$heights <- max_heights[[1]]
#> }
#> }
#> }
#> }
#> grobs
#> }
#> <bytecode: 0x7f93972b9310>
#> <environment: namespace:cowplot>
Created on 2019-12-01 by the reprex package (v0.3.0)
Both patchwork and cowplot define functions
align_plots(), which fundamentally do the same thing but using quite different APIs and approaches. For the immediate future, I don't see a way of unifying them. I also think it will be quite confusing for the two packages to both define this function, since both packages will quite often be loaded at the same time (e.g., if people want to use the cowplot themes).Since
cowplot::align_plots()has been on CRAN for a while, and there's definitely code floating around using it (see e.g. here), would it be possible to rename the patchwork function and quickly re-release on CRAN? Maybe rename tojustify_plots()oralign_plot_panels()?Created on 2019-12-01 by the reprex package (v0.3.0)