2017-12-21 4 views
4

は、私の目標は、トラブルは、私はR.でggplot2を使用して対数スケールでグループ化されたバープロットを作成しようとしている

enter image description here

R.で以下のプロットを再作成することでした

これを生成したプログラムは高解像度のグラフを作成できないためです。数字の範囲は1から1000を超え、その間にはどこでもあるため、ログスケールが必要です。

これは、使用しているコードと同様に、データフレームの簡略化されたバージョンのスニペットです。私はggplot2を使ってプロットを作成することができましたが、私の問題は、データに1を多く持ち、最終的に0としてプロットされ、0は-1として表示されることです。私のRプロットは次のようになります。

enter image description here

genus_counts <- read.table(text = "Genus variable value 
1 Lepisosteus JBGC462  0 
2  Lepomis JBGC462  6 
3 Micropterus JBGC462  2 
4  Perca JBGC462  2 
5 Ictalurus JBGC462  1 
6 Lepisosteus JBGC13 13 
7  Lepomis JBGC13  0 
8 Micropterus JBGC13  0 
9  Perca JBGC13  0 
10 Ictalurus JBGC13  0", header = TRUE) 


ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+ 
     geom_bar(stat="identity", position="dodge")+ 
     scale_y_log10() 

は数学的には、私はこのような場合は理由を理解(ともバープロット上のログスケールは本当に理想的ではありません)。しかし、私がプロットしようとしているプロットに近い一致を得るためにプロット(または私がプロットに与えている数)を調整できる別の方法はありますか?

+0

'scale_y_sqrt()'類似した質問の – Mako212

+1

多く、例えば、[この1](https://stackoverflow.com/questions/41047939/ggplot-barplot-how-to-display-small-正の数 - 対数 - スケールされたy軸)。さらに、最善のアドバイスは常に棒グラフとログ軸を混在させない**です。 0または-'sは不可能です。すべての値が+ veであっても、(1)バーに沿って直線的に距離を知覚するので、バーは誤解を招きます。 (2)バーの相対的な大きさは、バーの底の値の選択に任意に依存する。したがって、自由に相違を抑制または誇張することができます。あなたがそれを見ている人の例を見つけることができるからといって、それを大丈夫にしてはいません。 – dww

+0

...代替案には、(1)すべての値が正の場合はドットチャート、(2)別々にグループを表示する場合は自由(リニア)yスケールでファセットする、(3)注文データが多くない場合スパンに達する大きさの場合、直線軸を使用します。 – dww

答えて

3

代わりにscale_y_sqrt()を使用すると、このように見えますが、これはあなたのサンプルプロットとよく似ています。私は1000の値を持つ行を追加して、1と2のような小さい値と大きな値の両方を見ることができることを示しました。たぶん

enter image description here

+0

しかし、この解決法は、[比例インクの原理](http://callingbullshit.org/tools/tools_proportional_ink.html)にも、対数スケールの数字のように違反することに注意してください。 –

3

問題は基本的に、正の数の棒または0の数の棒が無限に長いという事実に関連しています。

あなたはy軸の軸の範囲を変更すると何が起こるかを参照してください:この場合

genus_counts <- read.table(text = "Genus variable value 
1 Lepisosteus JBGC462  0 
2  Lepomis JBGC462  6 
3 Micropterus JBGC462  2 
4  Perca JBGC462  2 
5 Ictalurus JBGC462  1 
6 Lepisosteus JBGC13 13 
7  Lepomis JBGC13  0 
8 Micropterus JBGC13  0 
9  Perca JBGC13  0 
10 Ictalurus JBGC13  0", header = TRUE) 


ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+ 
    geom_bar(stat="identity", position="dodge")+ 
    scale_y_log10(limits = c(0.1, 15)) 

enter image description here

、バーが負にかなり長い道のりを行きます。しかし、我々ははるかに先に進むことができ、待つ:基準点が1である場合は、1に対する相対値の変化を見ることができるように対数スケールで

ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+ 
    geom_bar(stat="identity", position="dodge")+ 
    scale_y_log10(limits = c(1e-100, 15)) 

enter image description here

バープロットは、理にかなっています数字は<であり、1が下降するバーとして示されている。 ggplot2はこれを正しく処理します。基準点を0にしようとすると、すべての棒が無限に長くなり、適切な軸範囲を選ぶことができなくなります。

例として示すグラフは、y軸上に1の位置に0が置かれている点で、間違っています。値0は、そのプロットでは表示されず、すべてのバーの長さは誤解を招きます。

最後に、誰かが平方根を述べました。バーの長さが混乱しているので、私は、どちらかのこのソリューションの大ファンではないんだ

ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+ 
    geom_bar(stat="identity", position="dodge")+ 
    scale_y_sqrt(limits = c(0, 15), breaks = (0:4)^2) 

enter image description here

:それは無限に長い棒の問題を回避します。値6に対応するバーが、値1に対応するバーの約2.5倍であることに注目してください。私たちの脳は、バーの相対的な長さにそのようなバーとラッチを誤って解釈します。軸。

関連する問題