Search code examples
rggplot2gridextracowplottidygraph

multiple different sized plots in same window in R?


Similar questions have been asked many times, for example here and here. However, all of the other answers I have seen so far don't really solve my problem.

I am trying to plot multiple different sized plots in the same window. I am working with tidygraph objects and using ggraph to create the plots. I tried using gridExtra and cowplots, however, I cant seem to get them to work as I want.

For example, to begin I create some data, turn them into tidygraph objects and put them together in a list, like so:

library(tidygraph)
library(ggraph)
library(cowplot)
library(gridExtra)


# create some data
edges  <- data.frame(from = c(1,1), to = c(2,3))
edges1 <- data.frame(from = c(1, 2, 2, 1, 5, 5), to = c(2, 3, 4, 5, 6, 7))
edges2 <- data.frame(from = c(1,2,2,1), to = c(2,3,4,5))

tg   <- tbl_graph(edges = edges)
tg_1 <- tbl_graph(edges = edges1)
tg_2 <- tbl_graph(edges = edges2)

myList <- list(tg, tg_1, tg_2)

Then I create a plotting function using ggraph and create a list of plots, like so:

# create plotting function
plotFun <- function(List, n) {
   plot <- ggraph(List, "partition") +
    geom_node_tile(aes(fill = "red"), size = 0.25) +
    scale_y_reverse() +
    theme_void() +
    theme(legend.position = "none")
}

# create list of all plots
allPlots <- lapply(myList, plotFun, n = length(myList))

So, in my example, I have 3 different plots... and I am trying to plot all 3 in the same window, but each plot has a different size. My desired output is shown in the image below...

What I was trying to do is have one plot "full-sized", the 2nd plot, 1/2 the size of the first plot, and the third plot 1/4 the size of the first plot. That would look something like:

example plot

NOTE: the image was made in photoshop, so the scales I mentioned above aren't exact in the image.

My ideas at an attempted solution were to use either gridExtra or cowplot... I have included some basic attempts, but they don't work... they seem to change the column or row size rather than the actual plot size:

Attemped Solutions

# ATTEMPED COWPLOT SOLUTION
plot_grid(plotlist = allPlots, align = "hv", ncol = 2, rel_heights = c(1, 1/2, 1/4), rel_widths = c(1, 1/2, 1/4))


# ATTEMPED GRIDEXTRA SOLUTION
grid.arrange(
  grobs = allPlots,
  widths = c(1, 0.5, 1/4),
  heights = c(1, 0.5, 1/4),
  layout_matrix = rbind(c(1, 2, 3))
)

Solution

  • EDIT -- fixed to shrink third chart per OP.

    library(patchwork)
    design <- c(         # we specify the top, left, bottom, and right
      area(1, 1, 4, 4),  # coordinates for each of the three plots
      area(1, 5, 2, 6),
      area(3, 5)
    )
    allPlots[[1]] +  allPlots[[2]] + allPlots[[3]] + 
      plot_layout(design = design)
    

    enter image description here