Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Decrease margins between plots when using cowplot

Tags:

r

ggplot2

cowplot

I would like to combine some graphs together using cowplot. But I cannot change the margin sizes. I want to use only one y-axes, but than the margin is still quite large, which I want to decrease. I have used the plot.margin code from ggplot, although that works when I look at the single plot, it doesn't seem to work when the plots are combined.

I have made some example code:

library(ggplot2) 
library(cowplot)

x <- c("a", "b") 
y1 <- c(3,6) 
y2 <- c(10,15) 
data1 <- data.frame(x,y1) 
data2 <- data.frame(x, y2)

ylab1 <- ylab("Very nice y values") 
xlab1 <- xlab("Very nice factors")

plot1 <- ggplot(data1, aes(x=x, y = y1)) +    
geom_bar(stat ="identity", position=position_dodge(), fill = "grey")+  
theme(plot.margin = unit(c(0.5,0.5,0.5,0.5), "cm")) + xlab1 + ylab1
plot1

ylab2 <- ylab("") 
xlab2 <- xlab("Very nice factors") 

plot2 <- ggplot(data2, aes(x=x, y = y2)) +    
geom_bar(stat = "identity",position=position_dodge(), fill = "grey")+   
theme(plot.margin = unit(c(0.5,0.5,0.5,-0.5), "cm")) +    xlab2 + ylab2 
plot2

plot3 <- plot_grid(plot1, plot2, labels = c("A", "B"), align = "hv",nrow = 1, ncol = 2) 

plot3  # Quite large margin between the two plots

I am aware that I could avoid this problem by using facets, however my real plot is rather more complicated than this graph.

enter image description here

like image 221
Marinka Avatar asked Jan 24 '17 17:01

Marinka


2 Answers

Increasing the space between plots in plot_grid was also addressed in this issue.

An extra interesting solution is the one suggested in this comment - try to add an extra empty plot between the two plots and adjust the relative columns widths:

plot4 <- plot_grid(plot1, NULL, plot2, rel_widths = c(1, 0, 1), align = "hv",
          labels = c("A", "B"), nrow = 1)
plot4

enter image description here

Can even try negative values in rel_widths, which gives better results:

plot5 <- plot_grid(plot1, NULL, plot2, rel_widths = c(1, -0.1, 1), align = "hv",
                   labels = c("A", "B"), nrow = 1)
plot5

enter image description here

So, try a combination of adjusting the plot.margin (as answered by @J.Con) and adding an extra empty plot with tweaking rel_widths.


EDIT 2019-12-11

Also check out this comment of the author of cowplot (Claus Wilke):

For those kinds of problems I would now recommend the patchwork library. It's inherently difficult with plot_grid(), due to its underlying design

So, a fast example with patchwork based on their vignette Adding Annotation and Style goes like this:

library(patchwork)

plot3 <- plot1 + plot2 +
  plot_annotation(tag_levels = 'A') & 
  theme(plot.tag = element_text(size = 8))
plot3

Created on 2019-12-11 by the reprex package (v0.3.0)

like image 83
Valentin Avatar answered Oct 23 '22 07:10

Valentin


Your plot.margins were actually working against you. Set them to zero to fill up that white space.

plot1 <- ggplot(data1, aes(x=x, y = y1)) +    
  geom_bar(stat ="identity", position=position_dodge(), fill = "grey")+  
  theme(plot.margin = unit(c(0,0,0,0), "cm")) + xlab1 + ylab1
plot1

ylab2 <- ylab("") 
xlab2 <- xlab("Very nice factors") 

plot2 <- ggplot(data2, aes(x=x, y = y2)) +    
  geom_bar(stat = "identity",position=position_dodge(), fill = "grey")+   
  theme(plot.margin = unit(c(0,0,0,0), "cm")) +    xlab2 + ylab2 
plot2

plot3 <- plot_grid(plot1, plot2, labels = c("A", "B"), align = "hv",nrow = 1, ncol = 2) 

plot3

enter image description here

like image 43
J.Con Avatar answered Oct 23 '22 09:10

J.Con