45

ggplot2 を使用して、対数正規 y スケールのパフォーマンス チャートを作成しようとしています。残念ながら、基本プロット関数に関しては、いい目盛りを生成できません。

ここに私の例:

library(ggplot2)
library(scales)

# fix RNG
set.seed(seed = 1)

# simulate returns
y=rnorm(999, 0.02, 0.2)

# M$Y are the cummulative returns (like an index)
M = data.frame(X = 1:1000, Y=100)

for (i in 2:1000)
  M[i, "Y"] = M[i-1, "Y"] * (1 + y[i-1])

ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans())

醜いダニを生成します:

ここに画像の説明を入力

私も試しました:

ここに画像の説明を入力

ggplot(M, aes(x = X, y = Y)) + geom_line() + 
  scale_y_continuous(trans = log_trans(), breaks = pretty_breaks())

デフォルトのプロット関数と同じブレーク/ティックを取得するにはどうすればよいですか:

plot(M, type = "l", log = "y")

ここに画像の説明を入力

結果は次のようになりますが、ブレークをハードタイピングするのではなく動的です。次のような機能を試しaxisTicks()ましたが、成功しませんでした:

ggplot(M, aes(x = X,y = Y)) + geom_line() + 
  scale_y_continuous(trans = log_trans(), breaks = c(1, 10, 100, 10000))

ここに画像の説明を入力

ありがとう!

編集: 挿入された写真

4

5 に答える 5

41

基本的なグラフィックスの動作は、カスタム ブレーク関数を使用して再現できます。

base_breaks <- function(n = 10){
    function(x) {
        axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n)
    }
}

これをサンプル データに適用すると、 を使用した場合と同じ結果が得られますtrans_breaks('log10', function(x) 10^x)

ggplot(M, aes(x = X, y = Y)) + geom_line() +
    scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + 
    theme(panel.grid.minor = element_blank())

10 のべき乗で壊れる

ただし、y 値が 50 ~ 600 のデータのサブセットに対して同じ関数を使用できます。

M2 <- subset(M, Y > 50 & Y < 600)
ggplot(M2, aes(x = X, y = Y)) + geom_line() +
    scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + 
    theme(panel.grid.minor = element_blank())

ここでは 10 のべき乗は適切ではないため、base_breaks別のきれいなブレークを生成します。

きれいな休憩

マイナー グリッド ラインをオフにしたことに注意してください。場合によっては、y 軸のメジャー グリッドラインの中間にグリッド ラインを配置することが理にかなっていますが、常にそうであるとは限りません。

編集

最小値が 0.1 になるように M を変更するとします。

M <- M - min(M) + 0.1

base_breaks() 関数は引き続きプリティ ブレークを選択しますが、ラベルは科学的表記法であるため、「プリティ」とは見なされない場合があります。

ggplot(M, aes(x = X, y = Y)) + geom_line() +
    scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + 
    theme(panel.grid.minor = element_blank())

ここに画像の説明を入力

labelsテキストの書式設定関数を の引数に渡すことで、テキストの書式設定を制御できますscale_y_continuous。この場合prettyNum、基本パッケージからうまく機能します。

ggplot(M, aes(x = X, y = Y)) + geom_line() +
scale_y_continuous(trans = log_trans(), breaks = base_breaks(),
                   labels = prettyNum) + 
theme(panel.grid.minor = element_blank())

ここに画像の説明を入力

于 2014-03-06T14:47:22.003 に答える
23

対数スケールでグラフを作成すると、次のようにうまく機能することがわかります。

library(ggplot2)
library(scales)

g = ggplot(M,aes(x=X,y=Y)) + geom_line()
g +  scale_y_continuous(trans = 'log10',
                        breaks = trans_breaks('log10', function(x) 10^x),
                        labels = trans_format('log10', math_format(10^.x)))

いくつかの違い:

  1. 軸ラベルは 10 の累乗で表示されます - これは私が気に入っています
  2. マイナー グリッド ラインは、メジャー グリッド ラインの中央にあります (このプロットを Andrie's answer のグリッド ラインと比較してください)。
  3. x 軸の方がきれいです。Andrie のプロットでは、何らかの理由で x 軸の範囲が異なります。

与える

ここに画像の説明を入力

于 2013-01-10T13:17:13.947 に答える
16

基本グラフィック関数axTicks()は、現在のプロットの軸の切れ目を返します。したがって、これを使用して、ベースグラフィックと同じブレークを返すことができます。唯一の欠点は、最初にベースグラフィックスプロットをプロットする必要があることです。

library(ggplot2)
library(scales)


plot(M, type="l",log="y")
breaks <- axTicks(side=2)
ggplot(M,aes(x=X,y=Y)) + geom_line() +
  scale_y_continuous(breaks=breaks) +
  coord_trans(y="log")

ここに画像の説明を入力してください

于 2013-01-10T10:29:58.217 に答える