假设我想绘制一个R函数:
weibull <- function(ALPHA, LAMBDA, T){
ALPHA*LAMBDA*(T^(ALPHA-1))
}
所以函数接受参数alpha,lambda和T.我想生成一个图,其中在一个图中alpha = 0.5,时间范围从0到2,lambda = 1,2,4,8,16和另一个,alpha = 1,时间范围从0到2,lambda = 1,2,4,8,1。
过去只使用一个参数绘制函数,我使用了曲线然后在同一个图上想要另一条曲线时完成ADD = TRUE。所以,例如,过去我曾经使用过:
lambda <- 0.5
pdf <- function(x){
lambda*exp(-lambda*x)
}
survival <- function(x){
exp(-lambda*x)
}
plot(curve(pdf, 0, 6), type="l", ylim=c(0, 1), lwd=3, ylab="", xlab="", xaxs="i", yaxs="i", main=expression(paste("Exponential Distribution ", lambda, "=0.5")), cex.main=2, cex.axis=2, cex.lab=2)
curve(survival, 0, 6, add=TRUE, col="plum4", lwd=3)
但是在这个例子中,函数只有一个参数,即x。然而,现在我想改变LAMBDA,T和ALPHA。曲线功能不起作用,我不知道如何处理这个问题。
答案 0 :(得分:6)
如果您使用curve
,则可以指定一个带有自由变量x
的表达式,该表达式将替换为from=
/ to=
参数中指定的值范围。例如,您可以
weibull <- function(ALPHA, LAMBDA, T){
ALPHA*LAMBDA*(T^(ALPHA-1))
}
lambda<-c(1, 2, 4, 8, 16)
col<-rainbow(length(lambda))
layout(matrix(1:2, nrow=1))
for(i in seq_along(lambda)) {
curve(weibull(.5, lambda[i], x), from=0, to=2, add=i!=1, col=col[i], ylim=c(0,50), main="alpha=.5")
}
legend(1,50,lambda, col=col, lty=1)
for(i in seq_along(lambda)) {
curve(weibull(1, lambda[i], x), from=0, to=2, add=i!=1, col=col[i], ylim=c(0,20), main="alpha=1")
}
会产生类似
的情节
答案 1 :(得分:4)
我会用plyr和ggplot2,
来做
weibull <- function(alpha, lambda, time){
data.frame(time = time, value = alpha*lambda*(time^(alpha-1)))
}
library(plyr)
library(ggplot2)
params <- expand.grid(lambda = c(1, 2, 4, 8, 16), alpha = c(0.5, 1))
all <- mdply(params, weibull, time = seq(0, 2, length=100))
ggplot(all, aes(time, value, colour=factor(lambda)))+
facet_wrap(~alpha,scales="free", ncol=2) + geom_line()
答案 2 :(得分:0)
这与MrFlick的答案相似,但更短:
par(mfrow=1:2)
lapply(0:4, function(l) curve(weibull(0.5, 2^l, x), col=l+1, add=l!=0, ylim=c(0,50), xlim=c(0,2)))
lapply(0:4, function(l) curve(weibull(1, 2^l, x), col=l+1, add=l!=0, ylim=c(0,50), xlim=c(0,2)))
好的,如果你是嵌套lapply
的忠实粉丝,你也可以这样做:
lapply(c(0.5,1), function(a) lapply(0:4, function(l) curve(weibull(a, 2^l, x), col=l+1, add=l!=0, ylim=c(0,50), xlim=c(0,2))))