【问题标题】:Multiple plots using curve() function (e.g. normal distribution)使用曲线()函数的多个图(例如正态分布)
【发布时间】:2017-04-25 19:06:29
【问题描述】:

我正在尝试使用曲线()绘制多个函数。我的示例尝试绘制具有不同均值和相同标准差的多个正态分布。

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() 函数每次都会创建一个新图,只绘制第二个正态分布

【问题讨论】:

标签: r plot curve


【解决方案1】:

我重新打开了这个问题,因为表面上的重复专注于绘制两个不同的函数或两个不同的 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))

【讨论】:

  • 就绘图而言,我想在这个答案中指出两个出色的解决方案:使用 plot(NA, ...) 创建一个空图,最重要的是绘制平均线到带段的曲线。我一定会使用这些解决方案重写我自己的代码。
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 2016-03-06
  • 2023-03-14
  • 2021-12-04
  • 2019-11-04
  • 1970-01-01
相关资源
最近更新 更多