2017-02-13 81 views
0

我想疊加兩個正態分佈。但是,如果我限制XLIM一個狹窄的INTERVALL,情節看起來很怪異:ggplot2疊加正態分佈:Bug?

see here

library(ggplot2) 
x=seq(1,6,.01) 
dat <- data.frame(
    c1 = dnorm(x,4.95, .72), 
    c2 = dnorm(x,4.85, .91), x = x 
) 
    ggplot(data=dat, aes(x=x)) + 
    geom_polygon(aes(y=dat[,1]), fill="red", alpha=0.6) + 
    geom_polygon(aes(y=dat[,2]), fill="blue", alpha=0.6) + 
    xlab("Scale") + ylab("") + xlim(1,6) 

如果範圍擴大,它的工作原理:

see here

x=seq(1,10,.01) 
    dat <- data.frame(
     c1 = dnorm(x,4.95, .72), 
     c2 = dnorm(x,4.85, .91), x = x 
    ) 
     ggplot(data=dat, aes(x=x)) + 
     geom_polygon(aes(y=dat[,1]), fill="red", alpha=0.6) + 
     geom_polygon(aes(y=dat[,2]), fill="blue", alpha=0.6) + 
     xlab("Scale") + ylab("") + xlim(1,10) 

(見輸出圖)。但是,我想將x軸限制在1到6之間。任何幫助都將不勝感激! 另外,你有任何建議如何添加標籤的情節右側?

+1

順便說一句,這有什麼好做的疊加。只繪製一個單獨的多邊形會產生類似的結果。 –

回答

1

這不是一個錯誤 - 你在y重新加入x軸之前切斷了範圍,所以這就是多邊形到達第一個點的位置。如果要在x軸上建立多邊形,則可以使用geom_ribbon

ggplot(dat) + 
    aes(x, ymin = 0) + 
    geom_ribbon(aes(ymax = c1), fill = 'red', alpha = 0.6) + 
    geom_ribbon(aes(ymax = c2), fill = 'blue', alpha = 0.6) + 
    xlim(1, 6) 
+0

謝謝。你如何添加一個帶有「c1 - red」和「c2 - blue」的圖例? – Paul

+0

@Paul它不適用於方法。 alistaire的另一個答案顯示瞭如何做到這一點:您需要重新整理數據,以便它包含描述分佈的變量(在他的示例中爲'var')。 –

2

您可以使用geom_areaposition = "identity"。重新整理和清洗了一下,

library(tidyverse) 

ggplot(dat %>% gather(var, val, -x), aes(x = x, y = val, fill = var)) + 
    geom_area(alpha = 0.6, position = 'identity') + 
    labs(x = "Scale", y = NULL, fill = 'Variable') 

area plot

+1

'geom_area'很整齊。 –

+0

謝謝。這解決了它。 – Paul