3

stat_functionRで頭を動かそうとして深刻な問題を抱えていggplot2ます。私はこの些細な例から始めました:

ggplot(data.frame(x = c(1, 1e4)), aes(x)) + stat_function(fun = function(x) x)

これは期待どおりに機能します。残念ながら、x軸とy軸の両方に対数目盛を追加すると、次のようになります。

ggplot(data.frame(x = 1:1e4), aes(x)) +
  scale_x_log10() + 
  scale_y_log10() +
  stat_function(fun = function(x) x)

次の結果が得られます。これは、恒等関数のかなり厄介な違反です。 ここに画像の説明を入力してください

私が見逃している非常に基本的なものはありますか?それでは、対数スケールで関数をプロットするための正しくて最もハッキーでない方法は何ですか?

編集: 私が行った答えに触発され、スケールとaestheticsパラメーターを試してみました。以下のコードを使用して、期待どおりの結果が得られたことを知り、さらに戸惑いました。

ggplot(data.frame(x = 1:1e4, y = 1:1e4), aes(x, y)) +
  scale_x_log10() + 
  scale_y_log10() +
  stat_function(fun = function(x) x)

明らかに未使用のy値のベクトルを使用します(stat_functionつまり、未使用です)。軸変換はデータの可用性に依存しますか?

4

2 に答える 2

5

を使用するとscale_x_log10()x値は対数変換され、でy値を計算するためにのみ使用されますstat_function()。次に、x値が元の値に逆変換されてスケールが作成されます。y値は、変換された対数から計算されたままxです。これは、。なしで値をプロットすることで確認できますscale_y_log10()。プロットには直線があります。

ggplot(data.frame(x=1:1e4), aes(x)) +
    stat_function(fun = function(x) x) +
    scale_x_log10() 

適用すると、scale_y_log10()すでに計算されyた値を対数変換するため、曲線がプロットされます。

于 2013-02-28T20:41:42.183 に答える
5

ggplot2では、スケール変換が統計的変換に先行し、統計的変換が座標変換に先行するという規則があります。このコンテキストでは、関数(stat_function()を介して)は統計変換です。

ggplot2呼び出しでscale_x/y _ *()関数を使用する場合、関数を計算する前に、最初にスケール変換が適用されます。

ケース0:xとyの元のスケールでプロットします。

ggplot(data.frame(x = 1:1e4, y = 1:1e4), aes(x, y)) +
    stat_function(fun = function(x) x)

ケース1a:scale_x / y_log10()が存在するため、関数が計算される前にxとyの両方が対数変換されます。これは、それぞれのスケールの値から確認できます(ケース0と比較してください)。

ggplot(data.frame(x = 1:1e4, y = 1:1e4), aes(x, y)) +
    stat_function(fun = function(x) x) +
    scale_x_log10() +
    scale_y_log10()

ケース1b:xは元のデータフレームで対数変換されます。したがって、関数は実際にはlog10(x)値で動作するため、直線になりますが、xとyの両方でlog10スケールになります。

ggplot(data.frame(x = log10(seq(1e4)), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x)

ケース1c:1bと同じですが、1つの例外があります。ただし、xのスケール変換は統計変換f(y)=の前に行われるため、xスケールは元の単位ですがyスケールはlog10(x)単位です。 yが計算されます。ここで、y = log10(x)です。

ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x) +
    scale_x_log10()

ケース2:対照的に、座標変換は統計変換の後に行われます。つまり、関数は最初に元の単位で計算され、次にxで座標変換が行われ、関数がワープされます。

ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x) +
    coord_trans(xtrans = "log10")

...もちろん、xとyの両方に同じ変換を適用しない限り:

ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) +
    stat_function(fun = function(x) x) +
    coord_trans(xtrans = "log10", ytrans = "log10")
于 2013-03-02T08:46:36.490 に答える