我有一个数据给出了平均值 和SD:
#info mean sd
info1 20.84 4.56
info2 29.18 5.41
info3 38.90 6.22
实际上有超过100行。 如何为一个图中的每一行绘制正态分布 鉴于以上数据?
答案 0 :(得分:8)
根据N真正获得的大小,您可能希望将其拆分为一组多个图表。但是,这是基本方法。首先,您需要根据您的平均值和标准生成一些随机数据。我选择了1000个随机点,你可以根据需要进行调整。接下来,使用适当的尺寸设置空白图,然后使用lines
和density
添加数据。我使用了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))
或者,使用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()
答案 1 :(得分: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))