X 軸を共有するが 2 つの異なるスケールの Y 軸を持つ ggplot を使用して散布図を作成しようとしています。
Y 軸の下部には、0% から 0.1%、次に 0.1% から 1%、最後に 10% ごとの等間隔の 3 つの目盛りがあります。
ここからの例:
ggplot を使用して R でこのようなものを生成する方法はありますか? 軸を変更しますか?同じパネルに複数のプロットを重ねますか? または、他の何か?
X 軸を共有するが 2 つの異なるスケールの Y 軸を持つ ggplot を使用して散布図を作成しようとしています。
Y 軸の下部には、0% から 0.1%、次に 0.1% から 1%、最後に 10% ごとの等間隔の 3 つの目盛りがあります。
ここからの例:
ggplot を使用して R でこのようなものを生成する方法はありますか? 軸を変更しますか?同じパネルに複数のプロットを重ねますか? または、他の何か?
この質問で検討されている理由により、一般に、ggplot2 内で不連続な軸は推奨されません。Hadley Wickham (ggplot2 の作成者) がここで説明しています:
私はこのタイプのディスプレイの大ファンではありません。視覚的にゆがんでいると思うからです。すべてのデータの 1 つと小さな値の 1 つという 2 つのプロットを表示する方がはるかに適切だと思います。そうすれば、大きな値が小さな値をどれだけ支配しているかがわかります。
しかし、それは実際に可能です!カスタム軸変換を作成する必要がありますが、これは気弱な人向けではありません。
これが例です。y
対数正規スケールのデータがあるとします。
set.seed(20)
dat <- data.frame(x = c(0, rnorm(50)), y = c(0, exp(rnorm(50, -2, 1.5))))
ggplot(dat, aes(x, y)) + geom_point()
多くの点が下の方に密集しています: 1 未満のすべての値を対数スケールで、1 を超える値を線形スケールで表示したいとします。combine_trans
したがって、対数スケールと線形スケールを組み合わせたと呼ばれるカスタム変換を作成します(これは、0 になるように見えるため、上記の例のプロットが行うこととはまったく異なりますが、おそらく十分に近いです)。
combine_trans <- function(breakpoint, tr1, tr2,
br1 = tr1$breaks,
br2 = tr2$breaks) {
# combine two transformations.
# can also be given functions to determine tick marks
trans_breakpoint <- tr1$transform(breakpoint)
trans <- function(x) {
# choose which transformation to apply
ifelse(x < breakpoint,
tr1$transform(x),
tr2$transform(x - breakpoint) - trans_breakpoint)
}
inv <- function(x) {
# inverse of both transformations
ifelse(x < trans_breakpoint,
tr1$inverse(x),
breakpoint + tr2$inverse(x + trans_breakpoint))
}
br <- function(x) {
# combine break choices from both scales
br1 <- br1(c(x[x < breakpoint], breakpoint))
br2 <- br2(c(breakpoint, max(x[x > breakpoint])))
br <- c(br1, br2)
br[br > 0]
}
# combine domains
dom <- c(max(tr1$domain[1], tr2$domain[1]), min(tr1$domain[2], tr2$domain[2]))
trans_new("combined", trans, inv, breaks = br, domain = dom)
}
# combine log10 transformation and identity transformation
combined <- combine_trans(1, log10_trans(), identity_trans())
ggplot(dat, aes(x, y)) +
geom_point() +
scale_y_continuous(trans = combined) +
geom_hline(yintercept = 1, lty = 2)
で水平の破線を手動で追加したことgeom_hline
に注意してください。これは、少なくとも不連続性に注意を引くのに役立ちます.
不連続な変換の別の例をここで見ることができます。これは、軸に単純なブレークを導入します。
このコードは複雑で、カスタマイズが必要になる場合があることに注意してください。さらに、これはまだやや誤解を招く可能性があります。一般に、データを個別のプロットに分割するか、すべてを対数スケールにする必要があります。それでも、ggplot2 でこれらのツールにアクセスできることを知っておく価値はあります。