コンテクスト
いくつかのデータセット/変数があり、それらをプロットしたいのですが、これをコンパクトに実行したいと思います。これを行うには、同じy軸で異なるx軸を共有する必要があります。また、分布が異なるため、x軸の1つを対数スケーリングし、もう1つを線形スケーリングする必要があります。
例
ロングテール変数があるとします(プロット時にx軸をログスケールにしたい):
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()
そして正規変数:
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()
同じy軸を使用してそれらを並べてプロットしたいと思います。
試行#1
ファセットを使用してこれを行うことができます。これは見栄えがしますが、各x軸を異なるスケールで作成する方法がわかりません(scale_x_log10()
両方を対数スケールにします)。
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()
試行#2
を使用grid.arrange
しますが、両方のプロット領域を同じアスペクト比に保つ方法がわかりません。
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:プロットの数は変わる可能性があるので、特に2つのプロットの答えを探しているわけではありません