My goal is a complex plot that combines a scatter plot and 2 plots for density estimates. The problem I am facing is that the density plots are not aligned correctly with the scatter plot due to the lack of labels indicating the density plots and legends of the scatter plot. It can be adjusted by playing arround with plot.margin . However, this would not be the preferred solution, as I would have to adjust it again and again if changes were made to the graphs. Is there a way to position all the graphs so that the actual construction panels line up perfectly?

I tried to keep the code as minimal as possible, but in order to reproduce the problem, there is still quite a lot.
library(ggplot2) library(gridExtra) df <- data.frame(y = c(rnorm(50, 1, 1), rnorm(50, -1, 1)), x = c(rnorm(50, 1, 1), rnorm(50, -1, 1)), group = factor(c(rep(0, 50), rep(1,50)))) empty <- ggplot() + geom_point(aes(1,1), colour="white") + theme( plot.background = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_blank(), panel.background = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank() ) scatter <- ggplot(df, aes(x = x, y = y, color = group)) + geom_point() + theme(legend.position = "bottom") top_plot <- ggplot(df, aes(x = y)) + geom_density(alpha=.5, mapping = aes(fill = group)) + theme(legend.position = "none") + theme(axis.title.y = element_blank(), axis.title.x = element_blank(), axis.text.y=element_blank(), axis.text.x=element_blank(), axis.ticks=element_blank() ) right_plot <- ggplot(df, aes(x = x)) + geom_density(alpha=.5, mapping = aes(fill = group)) + coord_flip() + theme(legend.position = "none") + theme(axis.title.y = element_blank(), axis.title.x = element_blank(), axis.text.y = element_blank(), axis.text.x=element_blank(), axis.ticks=element_blank()) grid.arrange(top_plot, empty, scatter, right_plot, ncol=2, nrow=2, widths=c(4, 1), heights=c(1, 4))