2

X 軸を共有するが 2 つの異なるスケールの Y 軸を持つ ggplot を使用して散布図を作成しようとしています。

Y 軸の下部には、0% から 0.1%、次に 0.1% から 1%、最後に 10% ごとの等間隔の 3 つの目盛りがあります。

ここからの例:

ここに画像の説明を入力

ggplot を使用して R でこのようなものを生成する方法はありますか? 軸を変更しますか?同じパネルに複数のプロットを重ねますか? または、他の何か?

4

1 に答える 1

5

この質問で検討されている理由により、一般に、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 でこれらのツールにアクセスできることを知っておく価値はあります。

于 2015-02-26T08:30:55.510 に答える