2

いくつかの線分を使用してプロットに注釈を付けようとしています。X 軸は、対数変換によって最適に表示されます。これはggplot2、線分の位置に変換する必要がないことも意味します。しかし、変換を適用すると、線分が消えます (変換により、線分はプロット ウィンドウに「収まりません」)。それらを変換に「追従」させる方法に関する提案はありますか?

最小限の例:

library(ggplot2)
## Base plot:
B <- ggplot(data = data.frame(X = 10^(1:10), Y = 1:10),
            aes(x = X, y = Y)) + geom_point()
## Generate segments: 
S1 <- geom_segment(x = 1000, xend = 1000,
                   y = 3, yend = 5)
S2 <- geom_segment(x = 20, xend = 2.5e9,
                   y = 8, yend = 7)
## Generate transformation:
T <- scale_x_continuous(trans = "log")

以下を比較してください。

B               # Basic plot
B + T           # Basic plot, transformed
B + S1 + S2     # Basic, untransformed, with segments
B + S1 + S2 + T # Should be transformed with segments: segments missing

セグメントの位置を変換するだけでよいことはわかっていますが、よりggplot2スタイルの良いソリューションを見つけたいと思っています。

ハックソリューション:

S3 <- geom_segment(x = log(1000), xend = log(1000),
                   y = 3, yend = 5)
S4 <- geom_segment(x = log(20), xend = log(2.5e9),
                   y = 8, yend = 7)
B + S1 + S2
B + S3 + S4 + T #Fine, but not elegant.

ありがとう!

4

1 に答える 1

1

私が示したプロットがあなたの期待どおりかどうかはわかりません. しかし、そうであれば、以下の説明は有効です。

ggplot2変換が実行されaestheticsます。そして、データはプロットする前に最初に変換されます (または、変換されたデータに対して行われる、ex: geom_smooth などの種類のフィッティングを行います)。

したがって、ログ変換をセグメントに反映させたい場合は、次のようにラップする必要がありますaes

S1 <- geom_segment(aes(x=1000, xend=1000, y=3, yend=5))
S2 <- geom_segment(aes(x=20, xend=2.5e9, y=8, yend=7))

ちなみに、変換はlog10 で、 log ではありません:

T <- scale_x_continuous(trans = "log10")

今、プロットするとB + S1 + S2 + T

ggplot2_aes

さらに一歩:あなたと私のものを比較してB+S1+S2+Tください:S1S2

ggplot_build(B+S1+S2)$data # and 
ggplot_build(B+S1+S2+T)$data

それに応じて美学が変化することを確認します。

于 2013-02-20T16:49:02.323 に答える