8

次のようないくつかの外れ値を含むデータセットがあります

x <- rnorm(1000,0,20)
x <- c(x, 500, -500)

これを x 軸の線形スケールでプロットすると、次のようになります。

histogram(x)

非対数 x 軸

この便利なスレッドを使用して対数スケールに配置する良い方法を考え出しました: R のヒストグラムの y 軸に対数スケールを使用する方法は? :

mat <- data.frame(x)
ggplot(ee, aes(x = xx)) + geom_histogram(colour="darkblue", size=1, fill="blue") + scale_x_log10()

対数 x 軸

ただし、この 2 番目の例の x 軸ラベルを最初の例のラベルと一致させたいと思います。ただし、一種の「負の対数」を除きます。つまり、最初の目盛り (中央から左に移動) が -1 で、次に次は -10、次は -100 の可能性がありますが、すべて等距離です。それは理にかなっていますか?

4

4 に答える 4

20

あなたの目標を理解しているかどうかはわかりませんが、対数のような変換が必要でありながらゼロまたは負の値が必要な場合は、逆双曲線サイン変換asinh()が適切なオプションであることがよくあります。これは大きな値に対して対数に似ており、すべての実数値に対して定義されています。議論、詳細、その他のオプションについては、Rob Hyndman のブログstats.stackexchange.com のこの質問を参照してください。

これが受け入れられるアプローチである場合は、ggplot のカスタム スケールを作成できます。以下のコードは、asinh() 変換の視覚化とともに、カスタム スケール (カスタム ブレークを使用) を作成して使用する方法を示しています。

library(ggplot2)
library(scales)

limits <- 100
step <- 0.005
demo <- data.frame(x=seq(from=-1*limits,to=limits,by=step))

asinh_trans <- function(){
  trans_new(name = 'asinh', transform = function(x) asinh(x), 
            inverse = function(x) sinh(x))
}

ggplot(demo,aes(x,x))+geom_point(size=2)+
     scale_y_continuous(trans = 'asinh',breaks=c(-100,-50,-10,-1,0,1,10,50,100))+
     theme_bw()

ここに画像の説明を入力

ggplot(demo,aes(x,x))+geom_point(size=2)+
     scale_x_continuous(trans = 'asinh',breaks=c(0,1,10,50,100))+
     scale_y_log10(breaks=c(0,1,10,50,100))+ # zero won't plot
     xlab("asinh() scale")+ylab("log10 scale")+
     theme_bw()

ここに画像の説明を入力

于 2013-01-24T16:32:07.903 に答える
2

質問がかなり古いことに気づき、まったく同じ問題に遭遇したので、とにかく答えることにしました。

上記のいくつかの回答は、元の質問を誤解しているようです。これは有効な視覚化の質問だと思います。他の人にも役立つことを願って、私の解決策を以下に概説します。

私のアプローチは、および軸ggplotのカスタム対数変換を使用して作成することでした(カスタムブレークジェネレーターと同様に)xy

library(ggplot2)
library(scales)

# Create custom log-style x axis transformer (...,-10,-3,-1,0,1,3,10,...)
custom_log_x_trans <- function()
  trans_new("custom_log_x",
            transform = function (x) ( sign(x)*log(abs(x)+1) ),
            inverse = function (y) ( sign(y)*( exp(abs(y))-1) ),
            domain = c(-Inf,Inf))

# Custom log x breaker (...,-10,-3,-1,0,1,3,10,...)
custom_x_breaks <- function(x)
{ 
  range <- max(abs(x), na.rm=TRUE)

  return (sort( c(0,
                  sapply(0:log10(range), function(z) (10^z) ),
                  sapply(0:log10(range/3), function(z) (3*10^z) ),
                  sapply(0:log10(range), function(z) (-10^z) ),
                  sapply(0:log10(range/3), function(z) (-3*10^z) )
  )))
}

# Create custom log-style y axis transformer (0,1,3,10,...)
custom_log_y_trans <- function()
  trans_new("custom_log_y",
            transform = function (x) ( log(abs(x)+1) ),
            inverse = function (y) ( exp(abs(y))-1 ),
            domain = c(0,Inf))

# Custom log y breaker (0,1,3,10,...)
custom_y_breaks <- function(x)
{ 
  max_y <- length(x)

  range <- max(abs(max_y), na.rm=TRUE)

  return (sort( c(0,
                  sapply(0:log10(range), function(z) (10^z) ),
                  sapply(0:log10(range/3), function(z) (3*10^z) )
  )))
}

ggplot(data=mat) +
  geom_histogram(aes(x=x,fill=..count..), 
                 binwidth = 1, color="black", size=0.1) +
  scale_fill_gradient("Count", low = "steelblue", high = "red") +
  coord_trans(x="custom_log_x",y="custom_log_y") +
  scale_x_continuous(breaks = custom_x_breaks(mat$x)) +
  scale_y_continuous(breaks = custom_y_breaks(mat$x)) +
  theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5))  + 
  theme_bw()

これにより、次のプロットが得られます。

ここに画像の説明を入力

ご了承ください:

  • プロットには、各バーの絶対値を視覚的に示す配色も含まれています。
  • ビンは増加するにつれてますます薄くなりxます(対数変換の副作用)

どちらの場合も、2 つの外れ値がはっきりと見えます

于 2015-06-30T22:03:10.220 に答える
-1

なぜggplot2ソリューションに苦しむのですか? あなたの最初のプロットは格子histogram関数で行われました.これはあなたがとどまるべき場所です. histogram関数内で対数変換を直接適用し、引数を使用nintしてヒストグラム ビンの数を指定し、引数を使用してtype「カウント」または「密度」を選択します。必要なものはすべて揃っていると思いますが、質問の重要な詳細が欠けている可能性があります...

library(lattice)
histogram(log10(x), nint=50, type="count")

ここに画像の説明を入力

于 2013-01-26T19:17:22.397 に答える