我想绘制学生的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)
答案 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)
看到它不再那么可读了,虽然它可能更高效,但从可维护性或通信角度来看,它并不是一件好事。你总是要记住这种平衡。
您的代码不依赖于性能,因此我认为我的改进根本不会改善任何内容。