2011-09-19 108 views
1

更新:
我已經解決了我的問題。我正在尋找geom_polygon繪製正常和邏輯分佈

coord_cartesian(xlim = c(800, 2100), ylim = c(0, 0.0021)) 

感謝每一位試圖幫助!

問題是:
我想繪製一個正常和邏輯分佈之間的區別是一個很好的圖片。我已經達到了這一點:

x=seq(1000,2000,length=200) 
dat <- data.frame(
    norm = dnorm(x,mean=1500,sd=200), 
    logistic = dlogis(x,location=1500,scale=200), x = x 
) 
ggplot(data=dat, aes(x=x)) + 
    geom_polygon(aes(y=norm), fill="red", alpha=0.6) + 
    geom_polygon(aes(y=logistic), fill="blue", alpha=0.6) + 
    xlab("") + ylab("") + 
    opts(title="Logistic and Normal Distributions") + 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) 

但邏輯的一個是「切」在底部。我認爲我應該做的就是繪製這個分佈從0到3000例如但只顯示1000-2000。

任何線索如何做到這一點?

我試圖scale_x_continuous(限= C(1000,2000)),但是,這並不工作

UPDATE:

我已經更新了我的代碼,所以我的傳說,現在它看起來是這樣的:

x=seq(700,2300,length=200) 
    dat2 <- data.frame(x=x) 
    dat2$value <- dnorm(x,mean=1500,sd=200) 
    dat2$type <- "Normal" 

dat1 <- data.frame(x=x) 
dat1$value <- dlogis(x,location=1500,scale=200)  
dat1$type <- "Logistic" 

dat <- rbind(dat1, dat2) 

ggplot(data=dat, aes(x=x, y=value, colour=type, fill=type)) + geom_polygon(alpha=0.6) + scale_y_continuous(expand = c(0, 0)) 

回答

1

的解決方案是使用

+ coord_cartesian(xlim = c(800, 2100), ylim = c(0, 0.0021)) 
1

它切斷底部的原因是因爲geom_polygon字面上吸引包括連接你給它點線的多邊形。因此,分佈底部的扁平線只是連接數據框中的第一個和最後一個值。如果你想它延伸到底層,你可以添加適當的點,你的數據幀:

ggplot(data=dat, aes(x=x)) + 
    geom_polygon(aes(y=norm), fill="red", alpha=0.6) + 
    geom_polygon(data = rbind(c(NA,0,1000),dat,c(NA,0,2000)),aes(y=logistic), fill="blue", alpha=0.6) + xlab("") + ylab("") + 
    opts(title="Logistic and Normal Distributions")+ 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) 

enter image description here

編輯的清晰度

你可以用這個鼓搗得到它只需要通過添加具有正確值的點來儘可能減少。例如,我強制邏輯分配完全填充到零。您可以改爲使用正態分佈的水平,而不是最小正態密度值。另外,請小心,其中您將它們添加到您的數據框中。 geom_polygon將按照它們出現的順序連接點。這就是爲什麼我在數據框的開頭添加一個,最後添加一個。

編輯2

根據修改後的代碼,我的解決方案仍然能正常工作:

x=seq(700,2300,length=200) 
dat2 <- data.frame(x=x) 
dat2$value <- dnorm(x,mean=1500,sd=200) 
dat2$type <- "Normal" 

dat1 <- data.frame(x=x) 
dat1$value <- dlogis(x,location=1500,scale=200)  
dat1$type <- "Logistic" 

#Append extra points at the top/bottom to 
# complete the polygon 
dat1 <- rbind(data.frame(x=700,value=0,type = "Logistic"),dat1, 
       data.frame(x=2300,value=0,type = "Logistic")) 

dat <- rbind(dat1, dat2) 

ggplot(data=dat, aes(x=x, y=value, colour=type, fill=type)) + 
     geom_polygon(alpha=0.6) + 
     scale_y_continuous(expand = c(0, 0)) 

enter image description here

而且就個人而言,我寧願這個在coord_cartesian,因爲我一個堅持從零開始我的軸。

3

我會使用z得分從[-2; +2]。這有你的問題消失的副作用。

x=seq(-2,2,length=200) 
dat <- data.frame(
    norm = dnorm(x,mean=0,sd=0.2), 
    logistic = dlogis(x,location=0,scale=0.2), x = x 
) 
p <- ggplot(data=dat, aes(x=x)) + 
    geom_polygon(aes(y=norm), fill="red", alpha=0.6) + 
    geom_polygon(aes(y=logistic), fill="blue", alpha=0.6) + 
    xlab("z") + ylab("") + 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) + 
    opts(title="Logistic and Normal Distributions") 

print(p) 

enter image description here

0

我跑你的代碼,然後分析了規範和物流的價值觀:

Rgames:MYSTAT(DAT $後勤)

min  max  mean median 

3.51e-04 1.25e-03 8.46e-04 8.63e-04

2.96e-04 -1.33e-01 -1.4

Rgames:MYSTAT(DAT $規範)

min  max  mean median 

8.76e-05 1.99e-03 9.83e-04 9.06e-04

sdev  skew kurtosis 

6.62e-04 1.67e-01 -1.48

所以,你的邏輯值,其實正確繪製。正如其他答案顯示的那樣,有更好的方法來創建您的基礎數據。