2012-02-29 3 views
15

私はggplotを使ってスケーリングに興味深い問題に遭遇しました。デフォルトのリニアスケールを使ってグラフを作成することができるデータセットがありますが、scale_y_log10()を使用すると数字が途切れてしまいます。ここにいくつかのコード例と2つの画像があります。リニアスケールの最大値は〜700で、ログのスケーリングは10^8の値になります。データセット全体が〜8000項目しかないので、何かが正しくないことを示しています。ggplot scale_y_log10()issue

この問題は、私のデータセットとビンニングの構造と関係があり、このエラーを 'diamonds'のような共通データセットに複製できないと思います。しかし、私はトラブルシューティングの最善の方法は不明です。

おかげで、 ザックのCP


編集:

example_1 = ggplot(diamonds, aes(x=clarity, fill=cut)) + 
    geom_bar() + scale_y_log10(); print(example_1) 

#data.melt is the name of my dataset  
> ggplot(data.melt, aes(name, fill= Library)) + geom_bar() 
> ggplot(data.melt, aes(name, fill= Library)) + geom_bar() + scale_y_log10() 
> length(data.melt$name) 
[1] 8003 

linear scale log scale

:bdamarestは、このようなダイヤモンドのデータセットのスケールの問題を再現することができます

ここにいくつかのサンプルデータがありますが、私はその問題を見ると思います。元の溶けたデータセットは〜10^8行の長さになっている可能性があります。たぶん行番号が統計に使用されているのでしょうか?

> head(data.melt) 
     Library   name    group 
221938  AB Arthrofactin  glycopeptide 
235087  AB Putisolvin  cyclic peptide 
235090  AB Putisolvin  cyclic peptide 
222125  AB Arthrofactin  glycopeptide 
311468  AB  Triostin cyclic depsipeptide 
92249  AB   CDA   lipopeptide 


> dput(head(test2)) 
structure(list(Library = c("AB", "AB", "AB", "AB", "AB", "AB" 
), name = c("Arthrofactin", "Putisolvin", "Putisolvin", "Arthrofactin", 
"Triostin", "CDA"), group = c("glycopeptide", "cyclic peptide", 
"cyclic peptide", "glycopeptide", "cyclic depsipeptide", "lipopeptide" 
)), .Names = c("Library", "name", "group"), row.names = c(221938L, 
235087L, 235090L, 222125L, 311468L, 92249L), class = "data.frame") 

UPDATE:

行番号は問題ではありません。ここで、同一のデータが同一のAES x軸を使用してグラフ化し、色を記入し、スケーリングは完全に正しいである:

> ggplot(data.melt, aes(name, fill= name)) + geom_bar() 
> ggplot(data.melt, aes(name, fill= name)) + geom_bar() + scale_y_log10() 
> length(data.melt$name) 
[1] 8003 

enter image description here enter image description here

答えて

24

geom_barscale_y_log10(または任意の対数目盛)うまく機能しません一緒に期待された結果を与えません。

第1の基本的な問題は、バーが0になり、対数スケールで0が負の無限大に変換されることです(プロットが難しい)。この周りのベビーベッドは通常0ではなく1から始まります($ \ log(1)= 0 $以降)。0カウントの場合は何も表示せず、歪みについて心配する必要はありません。 1から外れることに気をつけないでください(必ずしも真ではありません...)

@dbemarestが示したdiamondsの例を使用しています。

これを行うには、縮尺ではなく座標を変換するのが一般的です(違いについては後で詳しく説明します)。

ggplot(diamonds, aes(x=clarity, fill=cut)) + 
    geom_bar() + 
    coord_trans(ytrans="log10") 

しかし、これは負の無限大の問題から生じるエラー

Error in if (length(from) == 1 || abs(from[1] - from[2]) < 1e-06) return(mean(to)) : 
    missing value where TRUE/FALSE needed 

を与えます。

縮尺変換を使用すると、変換がデータに適用され、次に統計と手配が行われ、縮尺が逆変換(大まかに)に表示されます。自分で計算を打ち破って何が起きているのかを見ることができます。

ggplot(DF, aes(x=clarity, y=n, fill=cut)) + 
    geom_bar(stat="identity") 

enter image description here

とy軸が与えるスケーリング:私たちは、通常の方法でこれをプロットすると

> head(DF) 
    clarity  cut n log10n 
1  I1  Fair 210 2.322219 
2  I1  Good 96 1.982271 
3  I1 Very Good 84 1.924279 
4  I1 Premium 205 2.311754 
5  I1  Ideal 146 2.164353 
6  SI2  Fair 466 2.668386 

は、我々が予想されるバープロットを取得できます

DF <- ddply(diamonds, .(clarity, cut), summarise, n=length(clarity)) 
DF$log10n <- log10(DF$n) 

あらかじめ要約されていないデータを使用する場合と同じ問題です。

ggplot(DF, aes(x=clarity, y=n, fill=cut)) + 
    geom_bar(stat="identity") + 
    scale_y_log10() 

enter image description here

我々はこの問題は、カウントのlog10()値をプロットすることにより起こるかを見ることができます。

ggplot(DF, aes(x=clarity, y=log10n, fill=cut)) + 
    geom_bar(stat="identity") 

enter image description here

これはただscale_y_log10とのいずれかのように見えますが、ラベルは...代わりに10^0^5 10、10^10、、0、5、10です。 ..

したがって、scale_y_log10を使用すると、カウントが行われ、ログに変換され、それらのログがスタックされ、アンチログ形式でスケールが表示されます。ただし、スタッキングログは線形変換ではありません。したがって、何をするように求めても意味がありません。

一番下の行は、ログスケール上の積み重なった棒グラフは、0から始めることができず(棒の底がどこにあるべきなのか)、棒の部分を比較することが妥当でないそれらのサイズは、スタック内のどこにあるかによって異なります。代わりのようなものと考える:

ggplot(diamonds, aes(x=clarity, y=..count.., colour=cut)) + 
    geom_point(stat="bin") + 
    scale_y_log10() 

enter image description here

それとも、本当に普通のバーを積み重ねることはあなたを与えるだろうというグループの合計をしたい場合は、あなたのような何かを行うことができます。

ggplot(diamonds, aes(x=clarity, y=..count..)) + 
    geom_point(aes(colour=cut), stat="bin") + 
    geom_point(stat="bin", colour="black") + 
    scale_y_log10() 

enter image description here

+1

ありがとうブライアン、私はあなたに詳細な説明をいただきありがとうございます。 geom_bar(position = "dodge")を使用することもできます(Winston Changの回答あり) – zach

+0

ここで何が起こっているのかをもう少し詳しく知るために、積み上げ棒グラフは通常、棒の高さをカウントの合計に等しくします。しかし、sum(log(counts))はlog(product(counts))に相当します。言い換えれば、あなたはカウントを一緒に掛けたかのようにバーの高さが表示されます。 – Brian