Context
I have some datasets/variables and I want to plot them, but I want to do this in a compact way. To do this I want them to share the same y-axis but distinct x-axis and, because of the different distributions, I want one of the x-axis to be log scaled and the other linear scaled.
Example
Suppose I have a long tailed variable (that I want the x-axis to be log-scaled when plotted):
library(PtProcess) library(ggplot2) set.seed(1) lambda <- 1.5 a <- 1 pareto <- rpareto(1000,lambda=lambda,a=a) x_pareto <- seq(from=min(pareto),to=max(pareto),length=1000) y_pareto <- 1-ppareto(x_pareto,lambda,a) df1 <- data.frame(x=x_pareto,cdf=y_pareto) ggplot(df1,aes(x=x,y=cdf)) + geom_line() + scale_x_log10() 
And a normal variable:
set.seed(1) mean <- 3 norm <- rnorm(1000,mean=mean) x_norm <- seq(from=min(norm),to=max(norm),length=1000) y_norm <- pnorm(x_norm,mean=mean) df2 <- data.frame(x=x_norm,cdf=y_norm) ggplot(df2,aes(x=x,y=cdf)) + geom_line() 
I want to plot them side by side using the same y-axis.
Attempt #1
I can do this with facets, which looks great, but I don't know how to make each x-axis with a different scale (scale_x_log10() makes both of them log scaled):
df1 <- cbind(df1,"pareto") colnames(df1)[3] <- 'var' df2 <- cbind(df2,"norm") colnames(df2)[3] <- 'var' df <- rbind(df1,df2) ggplot(df,aes(x=x,y=cdf)) + geom_line() + facet_wrap(~var,scales="free_x") + scale_x_log10() 
Attempt #2
Use grid.arrange, but I don't know how to keep both plot areas with the same aspect ratio:
library(gridExtra) p1 <- ggplot(df1,aes(x=x,y=cdf)) + geom_line() + scale_x_log10() + theme(plot.margin = unit(c(0,0,0,0), "lines"), plot.background = element_blank()) + ggtitle("pareto") p2 <- ggplot(df2,aes(x=x,y=cdf)) + geom_line() + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.title.y = element_blank(), plot.margin = unit(c(0,0,0,0), "lines"), plot.background = element_blank()) + ggtitle("norm") grid.arrange(p1,p2,ncol=2) 
PS: The number of plots may vary so I'm not looking for an answer specifically for 2 plots


grid.arrange(method #2) and play with thewidthargument until you get the aspect ratios/plot area widths the same.plot.marginfrom thethemeand see if that makes a difference?