Plot a function with several arguments in R

前端 未结 4 2121
萌比男神i
萌比男神i 2020-12-19 22:47

Suppose I want to plot an R function:

weibull <- function(ALPHA, LAMBDA, T){
ALPHA*LAMBDA*(T^(ALPHA-1))
}

So the function takes the arg

相关标签:
4条回答
  • 2020-12-19 23:17

    This is similar to MrFlick's answer but shorter:

    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)))
    

    Ok if you're a big fan of nested lapply's you can also do:

    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))))
    
    0 讨论(0)
  • 2020-12-19 23:30

    A tidyverse alternative,

    weibull <- function(alpha, lambda, time){
      data.frame(time = time, value = alpha*lambda*(time^(alpha-1)))
    }
    
    library(ggplot2)
    library(tidyverse)
    
    params <- tidyr::crossing(lambda = c(1, 2, 4, 8, 16), alpha = c(0.5, 1))
    
    
    params %>% 
      dplyr::mutate(purrr::pmap(., .f = weibull,  time = seq(0, 2, length=100))) %>% 
      tidyr::unnest() %>% 
      ggplot(aes(time, value, colour=factor(lambda)))+
        facet_wrap(~alpha,scales="free", ncol=2) + geom_line()
    
    0 讨论(0)
  • 2020-12-19 23:34

    If you use curve, you can specify an expression with a free variable x that will get replaced by the range of values specified in your from=/to= parameters. For example you can do

    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")
    }
    

    which will produce a plot like

    enter image description here

    0 讨论(0)
  • 2020-12-19 23:36

    I'd do it with plyr and ggplot2,

    enter image description here

    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()
    
    0 讨论(0)
提交回复
热议问题