2017-03-10 28 views
9

errorbarsを使用して線と点のグラフを作成しようとしています。それにはさまざまな要因がありますが、いくつかの要因には1つの価値しかありません。 position_dodgeを使用すると、単一値ファクタの1つがグラフの他のエラーバーと比較してずっと広いエラーバーを持つことが分かりました。何とかposition_dodgeがエラーバーの幅に影響します。私は前に同じ問題を抱えていた人は見つけられなかったので、誰かが私を助けてくれることを願っています。ggplot2 position_dodgeがエラーバーの幅に影響する

ダミーデータ: - position_dodgeなし

require(ggplot2) 

x <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,3,3,5) 
y <- c(3,5,6,3,5,3,5,6,2,6,3,7,3,6,2,1,5,8,7) 
se <- x*0.2 
treatment <- c("A", "B","C", "D","A", "B","C", "D","A", "B","C", "D","A", "B","C", "D","E", "F", "G") 
data <- data.frame(x, y, se ,treatment) 
data$treatment <- as.factor(data$treatment) 

最初のプロットは、すべてが

# Without position dodge 
myplot <- ggplot(data, aes(x=x, y=y, group= treatment, fill = treatment, colour = treatment)) + 
    geom_line(stat="identity", size = 1) + 
    geom_point(stat="identity", size = 3, shape = 21) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2) 

myplot 

plot without position_dodge

今すぐ位置にプロットはかわす結構です:

# With position dodge 
myplot <- ggplot(data, aes(x=x, y=y, group= treatment, fill = treatment, colour = treatment)) + 
    geom_line(stat="identity", size = 1, position=position_dodge(width=0.2)) + 
    geom_point(stat="identity", size = 3, shape = 21, position=position_dodge(width=0.2)) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2, position=position_dodge(width=0.2)) 

myplot 

Plot with position_dodge

右のエラーバーは、他のエラーバーと比較してはるかに大きな幅を持っています。これはおそらく、この点に重複するx変数がなく、エラーバーが通常のサイズを持つ可能性があるためです。私はまだエラーバーがどのように同じ幅になるのか知りたいです。

+0

多分、関連する問題:あなたは2番目のグラフを見ればhttps://github.com/tidyverse/ggplot2/issues/1068 – zx8754

+0

うん、おそらく、X = 3でのポイントはまた、持っていますエラーバーが小さくなります。これは、エラーバーの幅がグループの数によって決まるためです。 – Marinka

+0

はい、スペースはポイント数で共有され、水平線は短くなります。解決方法は、手動でのダッジを導入することです。例えば、x = 1は4点、x = c(1、1.02、1.04、1.06)になります。 – zx8754

答えて

4

@aosmithが示唆するように、これに対する修正は、そのxと点の数に誤差バーの幅をスケーリングすることです。ただし、手動で行う必要はありません。以下、dplyrを使用して、のポイント数に基づいてdata.frameに新しい列を作成します。 groupマッピングとfillマッピングを削除しました。ここではどちらも必要ではないので(fillではなくcolourで塗りつぶした円のバージョンに変更した場合)。最後に、繰り返しを避けるために、私はpositionを一度定義してから、それぞれgeomの変数を使用しました。

library(dplyr) 
data <- data %>% 
    group_by(x) %>% 
    mutate(
    width = 0.1 * n() 
) 

pos <- position_dodge(width = 0.2) 
myplot <- 
    ggplot(data, 
     aes(
      x = x, 
      y = y, 
      colour = treatment, 
      width = width 
     )) + 
    geom_line(size = 1, position = pos) + 
    geom_point(size = 3, shape = 16, position = pos) + 
    geom_errorbar(aes(ymin = y - se, ymax = y + se), position = pos) 

myplot 

Final image

+0

答えをありがとう、これは問題を解決します。 – Marinka

1

私が過去に使用したやや面倒な回避策は、widthの内側にaesを使用してエラーバーの幅を手動で設定することです。各グループ内の値の数は、各エラーバーをどれだけスケールするかを示します。

たとえば、1つの値を持つグループと3つの値を持つグループがある場合、3 widthのグループは1 widthのグループの3倍にする必要があります。

あなたは、1のグループ、6のグループ、および3のグループがあるので、あなたのケースははるかに複雑です。最初は、1つのグループの幅がどれほど大きいかを考え始めることができます。私は.1を選んだ。したがって、6のグループは.6の幅である必要があり、4のグループは.4の幅である必要があります。

次に、トリックは幅を取得するために線が描画される順序を考え出しています。これは簡単な状況の方が簡単です。

プロットコード:

ggplot(data, aes(x = x, y = y, group = treatment, fill = treatment, colour = treatment)) + 
    geom_line(stat = "identity", size = 1, position = position_dodge(width = 0.2)) + 
    geom_point(stat = "identity", size = 3, shape = 21, position = position_dodge(width = 0.2)) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se, 
        width = c(rep(.4, 8), rep(.6, 4), rep(.4, 4), .6, .6, .1)), 
       position = position_dodge(width = 0.2)) 

enter image description here

+0

答えをくれてありがとう、彼は自動解決で来たので、私はニックケネディの答えを受け入れた。 – Marinka

関連する問題