2016-12-08 14 views
0

主な問題:0から1.0までのデータを上向きのバー(0から始まる)として表示したいが、間隔を等間隔にしたくないしかし、ログ間隔。ggplot barplot:ログのスケールされたy軸の小さい正の数値を表示する方法

私はggplotの棒グラフとして以下のデータセットに「平均」と表示されている列を表示しようとしていますが、数字は非常に小さいので、ログ変換ではなくログスケールでy軸を表示したいデータそのもの。言い換えると、y軸ラベルが0,1e-8,1e-6 1e-4 1e-2、1e-0(すなわち0から1.0までですが、間隔はログスケールされています)の直立バーが必要です。

バーが反転しているため、以下の解決法は機能しません。

> print(df) 
     type   mean   sd   se snp 
V7 outer 1.596946e-07 2.967432e-06 1.009740e-08 A 
V8 outer 7.472417e-07 6.598652e-06 2.245349e-08 B 
V9 outer 1.352327e-07 2.515771e-06 8.560512e-09 C 
V10 outer 2.307726e-07 3.235821e-06 1.101065e-08 D 
V11 outer 4.598375e-06 1.653457e-05 5.626284e-08 E 
V12 outer 5.963164e-07 5.372226e-06 1.828028e-08 F 
V71 middle 2.035414e-07 3.246161e-06 1.104584e-08 A 
V81 middle 9.000131e-07 7.261463e-06 2.470886e-08 B 
V91 middle 1.647716e-07 2.875840e-06 9.785733e-09 C 
V101 middle 3.290817e-07 3.886779e-06 1.322569e-08 D 
V111 middle 6.371170e-06 1.986268e-05 6.758752e-08 E 
V121 middle 8.312429e-07 6.329386e-06 2.153725e-08 F 

以下のコード適切には、しかし、私はスケールy軸ログをしたいので、私は(scale_y_log10に追加エラーバー

ggplot(data=df, aes(x=snp,y=mean,fill=type))+ 
    geom_bar(stat="identity",position=position_dodge(),width=0.5) + 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se),width=.3, position=position_dodge(.45)) 

とグループ化barplotを生成する)を以下のように:

ggplot(data=df, aes(x=snp,y=mean,fill=type))+ 
    geom_bar(stat="identity",position=position_dodge(),width=0.5) + scale_y_log10() + 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se),width=.3, position=position_dodge(.45)) 

しかし、理想的にはバーは上から落ちていますが、私は単に彼らが(通常通り)上がってほしいと思っています。

あなたは

+2

barplotsはゼロで定義されています。あなたは非常に小さい数字を持っています。非常に小さい数の対数は負である。バーはゼロから負の数になります。 – Axeman

+0

私はデータそのものを変換してログに記録するのではなく、数値がまだ正の値なので、少し混乱しています。さらに、データをプロットすると、y軸単位はまだ1e-6(下)から1e-3まで増加していますが、不思議なことにバーは上から下に向かって "下降"しています。小さい数字。私はちょうどログスケールでデータを表示したいが、データ自体は変換しない。あなたが絶対にデータを変換していることを確かめています。 –

+2

あなたは絶対にデータを変換しています。 'scale_y_log10()' logはプロットする前にデータを変換します。 – hrbrmstr

答えて

4

ここでは、対数スケールでゼロからスタートバーを取得しようとするとどうなるかを示すために、ハッキングのビットですありがとうございました。私は図のようにgeom_segmentを使っていますので、任意の範囲に渡って "バー"(実際には広い線分)を作成することができます。この作業を行うために、私は手動ですべての避難を行わなければならなかったので、xのマッピングが奇妙に見えるのはこのためです。

以下の例では、スケールはy = 1e-20からy = 1になります。 y軸間隔は対数スケールであり、例えば1e-20から1e-19までの物理的距離が、例えば1e-8から1e-7までの物理的距離と同じであることを意味するが、これらの間隔の大きさ1兆倍の違いがあります。

ログスケールのゼロはグラフの下端から無限遠になるため、ゼロになるバーは表示できません。下のコードで1e-201e-100に変更するなどして、ゼロに近づけることができます。しかしそれは、データ値間の既に小さい物理的距離をさらに小さくし、したがって区別することをさらに困難にするだけである。

私たちの脳はバーに沿って直線的に距離を扱いますが、バーに沿った各距離の増分で表される大きさは、毎回約10倍変化するので、バーは別の方法で誤解を招きます以下の例では数ミリメートルです。バーは単にデータに関する意味のある情報をコード化していません。

ggplot(data=df, aes(x=as.numeric(snp) + 0.3*(as.numeric(type) - 1.5), 
        y=mean, colour=type)) + 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.3) + 
    geom_segment(aes(xend=as.numeric(snp) + 0.3*(as.numeric(type) - 1.5), 
        y=1e-20, yend=mean), size=5) + 
    scale_y_log10(limits=c(1e-20, 1), breaks=10^(-100:0), expand=c(0,0)) + 
    scale_x_continuous(breaks=1:6, labels=LETTERS[1:6]) 

enter image description here

あなたは対数目盛に固執したい場合は、多分ポイントをプロットすることは、より良いアプローチのようになります。

pd = position=position_dodge(.5) 
ggplot(data=df, aes(x=snp,y=mean,fill=type))+ 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se, colour=type), width=.3, position=pd) + 
    geom_point(aes(colour=type), position=pd) + 
    scale_y_log10(limits=c(1e-7, 1e-5), breaks=10^(-10:0)) + 
    annotation_logticks(sides="l") 

enter image description here

関連する問題