2012-04-27 230 views
4

有一個數據,讓平均 和SD:我如何繪製多個正態分佈在圖1中的R

#info mean sd 
info1 20.84 4.56 
info2 29.18 5.41 
info3 38.90 6.22 

其實有超過100行的這一點。 如何繪製一個圖中的每一行的正態分佈圖 給出上述數據?

+0

我以爲你想要一些方式每行數據進行區分,我選擇了線型,但你也可以使用顏色,或兩者的組合。或者,如果您不需要區分密度估計值,那麼將該部分全部忽略在一起:) – Chase 2012-04-27 02:07:20

回答

7

根據N真正獲得的大小,您可能希望將其分解爲一組多個圖表。但是,這是基本的方法。首先,您需要根據您的平均值和sd生成一些隨機數據。我選擇了1000個隨機點,您可以根據需要進行調整。接下來,設置適當尺寸的空白圖,然後使用linesdensity添加數據。我使用了一個for循環,因爲它提供了一種很好的方式來指定每個數據點的線型。最後,在末尾加上一個傳說:

dat <- read.table(text = "info mean sd 
info1 20.84 4.56 
info2 29.18 5.41 
info3 38.90 6.22 
", header = TRUE) 

densities <- apply(dat[, -1], 1, function(x) rnorm(n = 1000, mean = x[1], sd = x[2])) 
colnames(densities) <- dat$info 

plot(0, type = "n", xlim = c(min(densities), max(densities)), ylim = c(0, .2)) 
for (d in 1:ncol(densities)){ 
    lines(density(densities[, d]), lty = d) 
} 
legend("topright", legend=colnames(densities), lty=1:ncol(densities)) 

enter image description here

或者,使用GGPLOT2它可以有很多的好處,即它會自動地指定合理XLIM和ylim值你,做明智的事情這個傳說沒有什麼大驚小怪。

library(reshape2) 
library(ggplot2) 
#Put into long format 
densities.m <- melt(densities) 
#Plot 
ggplot(densities.m, aes(value, linetype = Var2)) + geom_density() 

enter image description here

+0

爲什麼要經歷生成隨機數據的過程,以便您可以在不生成數據的情況下繪製實際密度時使用密度估計值? – Dason 2012-04-27 04:44:09

+0

@Dason - 我的第一個問題是,OP想要一個點的散點圖,但後來他意識到他可能想要密度曲線......你說得對 - 如果最終目標只是使密度曲線。泰勒的答案顯示瞭如何直接使用'dnorm'。 – Chase 2012-04-27 12:30:36

+0

var2從哪裏來?我看不出使用因子(var2)來完成這項工作,因爲那時它抱怨aes的長度不一樣。什麼是'價值'? – 2017-04-12 15:20:05

6

同樣一美元短期和晚一天。蔡斯有一個非常徹底的迴應。這裏是我的裂紋吧:

dat <- read.table(text="info mean sd 
info1 20.84 4.56 
info2 29.18 5.41 
info3 38.90 6.22", header=T) 

dat <- transform(dat, lower= mean-3*sd, upper= mean+3*sd) 

plot(x=c(min(dat$lower)-2, max(dat$upper)+2), y=c(0, .25), ylab="", 
    xlim=c(min(dat$lower)-2, max(dat$upper)+2), xlab="", 
    axes=FALSE, xaxs = "i", type="n") 
box() 

FUN <- function(rownum) { 
    par(new=TRUE) 
    curve(dnorm(x,dat[rownum, 2], dat[rownum, 3]), 
     xlim=c(c(min(dat$lower)-2, max(dat$upper)+2)), 
     ylim=c(0, .22), 
     ylab="", xlab="") 
} 

lapply(seq_len(nrow(dat)), function(i) FUN(i)) 

enter image description here