2014-05-01 108 views
1

我正在使用ggplot2在單個圖上繪製兩個累積分佈。使用?stat_ecdf的示例,這很簡單。我的困難在於通過每個分佈的中值添加垂直線。通過累積分佈的中間值添加垂直線(ggplot2)

這是很容易用一個單一的分佈要做到這一點:

df <- data.frame(x = c(rnorm(100, 5, 10), rnorm(200, 0, 10)), 
    g = as.factor(c(rep(1, 100), rep(2, 200)))) 

ggplot(df, aes(x)) + 
    stat_ecdf() + 
    geom_vline(aes(xintercept = median(x))) 

但我想不出一個簡單的方法來添加垂直線,多個分佈。我已經嘗試沒有成功如下:

ggplot(df, aes(x, colour = g)) + 
    stat_ecdf() + 
    geom_vline(aes(xintercept = median(x), colour = g)) 

我可以排序的通過組裝階段的情節得到期望的結果:

p <- ggplot(df[df$g == 1, ], aes(x)) + 
    stat_ecdf() + 
    geom_vline(aes(xintercept = median(x))) 

p + 
    stat_ecdf(data = df[df$g == 2, ]) + 
    geom_vline(data = df[df$g == 2, ], aes(xintercept = median(x))) 

但這似乎這樣做也是一個凌亂的方式讓我手動設置不同的線條顏色。

當然有更好的方法嗎?

回答

2

嘗試這種情況:

ggplot(df, aes(x, colour = g)) + 
    stat_ecdf() + 
    geom_vline(aes(xintercept = median(x[g==1]), color=g[g==1])) + 
    geom_vline(aes(xintercept = median(x[g==2]), color=g[g==2])) 

通過添加第二geom_vline參數和指定每一行,並顏色指的是該基團,可以得到兩行與相應的顏色。希望有所幫助!

+0

這是有幫助的,因爲我不知道你可以在ggplot2中使用方括號這樣的子集!不幸的是,雖然這個答案適用於我的原始示例數據,但它給我的實際數據帶來了一個錯誤:_arguments意味着不同數量的rows_。我編輯了示例數據以反映每個級別中不同數量的值。 – Nicholas

+0

@Nicholas通過從'median'和'color'參數中刪除括號子集來代替'geom_vline'對象,而代之以包括'data = df [df $ g == 1,],'(或'data = df [df $ g == 2,],'第二個)在你的aes參數之前。這將爲每一行分配數據並允許每個數據長度不同。實線應該看起來像這樣:'geom_vline(data = df [df $ g == 1,],aes(xintercept = median(x),color = g))'&'geom_vline(data = df [df $ g == 2,],aes(xintercept = median(x),color = g))' – rmbaughman