使用 curve() 函数的多个图(例如正态分布)
Multiple plots using curve() function (e.g. normal distribution)
我正在尝试 使用曲线 () 绘制多个函数。我的示例尝试绘制具有不同均值和相同标准差的多个正态分布。
png("d:/R/standardnormal-different-means.png",width=600,height=300)
#First normal distribution
curve(dnorm,
from=-2,to=2,ylab="d(x)",
xlim=c(-5,5))
abline(v=0,lwd=4,col="black")
#Only second normal distribution is plotted
myMean <- -1
curve(dnorm(x,mean=myMean),
from=myMean-2,to=myMean+2,
ylab="d(x)",xlim=c(-5,5), col="blue")
abline(v=-1,lwd=4,col="blue")
dev.off()
由于 curve() 函数每次都会创建一个新图,仅绘制第二个正态分布。
我重新打开了这个问题,因为表面上的重复专注于绘制两个不同的函数或两个不同的 y 向量,分别调用 curve
。但是由于我们想要相同的函数,dnorm
,以不同的方式绘制,我们可以自动化这个过程(尽管其他问题的答案也可以以类似的方式概括和自动化)。
例如:
my_curve = function(m, col) {
curve(dnorm(x, mean=m), from=m - 3, to=m + 3, col=col, add=TRUE)
abline(v=m, lwd=2, col=col)
}
plot(NA, xlim=c(-10,10), ylim=c(0,0.4), xlab="Mean", ylab="d(x)")
mapply(my_curve, seq(-6,6,2), rainbow(7))
或者,为了进一步概括,让我们允许多个均值和标准差,并提供一个关于是否包括均值线的选项:
my_curve = function(m, sd, col, meanline=TRUE) {
curve(dnorm(x, mean=m, sd=sd), from=m - 3*sd, to=m + 3*sd, col=col, add=TRUE)
if(meanline==TRUE) abline(v=m, lwd=2, col=col)
}
plot(NA, xlim=c(-10,10), ylim=c(0,0.4), xlab="Mean", ylab="d(x)")
mapply(my_curve, rep(0,4), 4:1, rainbow(4), MoreArgs=list(meanline=FALSE))
您还可以使用从零开始到密度分布顶部停止的线段,而不是从图的底部一直延伸到顶部。对于正态分布,均值也是密度最高的点。但是,我使用下面的 which.max
方法作为识别出现最大 y 值的 x 值的更通用方法。我还添加了线宽 (lwd
) 和线端帽样式的参数(lend=1
表示扁平而不是圆形):
my_curve = function(m, sd, col, meanline=TRUE, lwd=1, lend=1) {
x=curve(dnorm(x, mean=m, sd=sd), from=m - 3*sd, to=m + 3*sd, col=col, add=TRUE)
if(meanline==TRUE) segments(m, 0, m, x$y[which.max(x$y)], col=col, lwd=lwd, lend=lend)
}
plot(NA, xlim=c(-10,20), ylim=c(0,0.4), xlab="Mean", ylab="d(x)")
mapply(my_curve, seq(-5,5,5), c(1,3,5), rainbow(3))
我正在尝试 使用曲线 () 绘制多个函数。我的示例尝试绘制具有不同均值和相同标准差的多个正态分布。
png("d:/R/standardnormal-different-means.png",width=600,height=300)
#First normal distribution
curve(dnorm,
from=-2,to=2,ylab="d(x)",
xlim=c(-5,5))
abline(v=0,lwd=4,col="black")
#Only second normal distribution is plotted
myMean <- -1
curve(dnorm(x,mean=myMean),
from=myMean-2,to=myMean+2,
ylab="d(x)",xlim=c(-5,5), col="blue")
abline(v=-1,lwd=4,col="blue")
dev.off()
由于 curve() 函数每次都会创建一个新图,仅绘制第二个正态分布。
我重新打开了这个问题,因为表面上的重复专注于绘制两个不同的函数或两个不同的 y 向量,分别调用 curve
。但是由于我们想要相同的函数,dnorm
,以不同的方式绘制,我们可以自动化这个过程(尽管其他问题的答案也可以以类似的方式概括和自动化)。
例如:
my_curve = function(m, col) {
curve(dnorm(x, mean=m), from=m - 3, to=m + 3, col=col, add=TRUE)
abline(v=m, lwd=2, col=col)
}
plot(NA, xlim=c(-10,10), ylim=c(0,0.4), xlab="Mean", ylab="d(x)")
mapply(my_curve, seq(-6,6,2), rainbow(7))
或者,为了进一步概括,让我们允许多个均值和标准差,并提供一个关于是否包括均值线的选项:
my_curve = function(m, sd, col, meanline=TRUE) {
curve(dnorm(x, mean=m, sd=sd), from=m - 3*sd, to=m + 3*sd, col=col, add=TRUE)
if(meanline==TRUE) abline(v=m, lwd=2, col=col)
}
plot(NA, xlim=c(-10,10), ylim=c(0,0.4), xlab="Mean", ylab="d(x)")
mapply(my_curve, rep(0,4), 4:1, rainbow(4), MoreArgs=list(meanline=FALSE))
您还可以使用从零开始到密度分布顶部停止的线段,而不是从图的底部一直延伸到顶部。对于正态分布,均值也是密度最高的点。但是,我使用下面的 which.max
方法作为识别出现最大 y 值的 x 值的更通用方法。我还添加了线宽 (lwd
) 和线端帽样式的参数(lend=1
表示扁平而不是圆形):
my_curve = function(m, sd, col, meanline=TRUE, lwd=1, lend=1) {
x=curve(dnorm(x, mean=m, sd=sd), from=m - 3*sd, to=m + 3*sd, col=col, add=TRUE)
if(meanline==TRUE) segments(m, 0, m, x$y[which.max(x$y)], col=col, lwd=lwd, lend=lend)
}
plot(NA, xlim=c(-10,20), ylim=c(0,0.4), xlab="Mean", ylab="d(x)")
mapply(my_curve, seq(-5,5,5), c(1,3,5), rainbow(3))