绘制具有自由度的学生t分布

时间:2018-03-12 13:43:31

标签: r

我想绘制学生的t分布,其自由度为1,2,5和10;所有在一个图中,并为图中的每个分布使用不同的颜色。此外,在画布的左上角创建一个图例,并为df = 1增加曲线的线宽。

我可以这样做,但我不确定是否有更好更快的方法来做到这一点:

x <- seq(-3, 3, length=1000)
hx <- dnorm(x)

degf <- c(1, 2, 5, 10)
colors <- c("red", "blue", "darkgreen", "gold", "black")
labels <- c("df=1", "df=2", "df=5", "df=10", "normal")

plot(x, hx, type="l", lty=1, xlab="x value",
     ylab="Density", main="Comparison of t Distributions")

for (i in 1:4){

  if (i == 1) {
    lines(x, dt(x,degf[i]), lwd=3, col=colors[i])
  } 
  else
  {
    lines(x, dt(x,degf[i]), lwd=1, col=colors[i])
  }
}

legend("topleft", inset=.05, title="Distributions",
       labels, lwd=1, lty=c(1, 1, 1, 1, 1), col=colors)

enter image description here

1 个答案:

答案 0 :(得分:2)

您的代码很好,对读者来说是可读且明显的。

如果您想使用某些矢量化,可以将for循环替换为单个mapply,请参阅此处:

x = seq(-3, 3, length=1000)
hx = dnorm(x)

degf = c(1, 2, 5, 10)
colors = c("red", "blue", "darkgreen", "gold", "black")
labels = c("df=1", "df=2", "df=5", "df=10", "normal")
plot(x, hx, type="l", lty=1, xlab="x value",
     ylab="Density", main="Comparison of t Distributions")

#The relevant modification
mapply(function(DoF, W, C) lines(x, dt(x, DoF), lwd=W, col=C), DoF = degf, W = c(3,1,1,1), C = colors[-5])

legend("topleft", inset=.05, title="Distributions",
       labels, lwd=1, lty=c(1, 1, 1, 1, 1), col=colors)

看到它不再那么可读了,虽然它可能更高效,但从可维护性或通信角度来看,它并不是一件好事。你总是要记住这种平衡。

您的代码不依赖于性能,因此我认为我的改进根本不会改善任何内容。