R, ggplot - Wykresy współdzielące tę samą oś Y, ale z różnymi skalami osi X

Kontekst

Mam kilka zestawów danych / zmiennych i chcę je wydrukować, ale chcę to zrobić w zwarty sposób. Aby to zrobić, chcę, aby współdzieliły tę samą oś Y, ale odrębną oś x, a ze względu na różne dystrybucje chcę, aby jedna z osi x była skalowana do dziennika, a druga skalowana liniowo.

Przykład

Przypuśćmy, że mam zmienną o długich ogonach (że chcę, aby oś x była skalowana logarytmicznie po wydrukowaniu):

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()

I normalna zmienna:

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()

Chcę je wykreślić obok siebie, używając tej samej osi y.

Próba # 1

Mogę to zrobić dzięki aspektom, które wyglądają świetnie, ale nie wiem, jak zrobić każdą oś X o innej skali (scale_x_log10() sprawia, że ​​oba z nich są skalowane do dziennika):

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()

Próba # 2

Posługiwać sięgrid.arrange, ale nie wiem, jak zachować oba obszary wykresu z tym samym współczynnikiem proporcji:

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: Liczba wątków może się różnić, więc nie szukam odpowiedzi specjalnie dla 2 działek

questionAnswers(1)

yourAnswerToTheQuestion