【问题标题】:How to plot several curves on one graph with defined function in R?如何在 R 中定义函数的一张图上绘制多条曲线?
【发布时间】:2020-12-29 15:22:10
【问题描述】:

我需要在一张图上绘制几条曲线。我从函数中得到了布朗模拟的轨迹:

brownian <- function(T,N){
  alpha=0
  sigma=1
  
  delta_t=T/N
  
  t=seq(0,T,by=delta_t)
  #x=c(0,alpha*delta_t+sigma*sqrt(delta_t)*rnorm(N,mean=0,sd=1))
  x=c(0,alpha*delta_t+sqrt(delta_t)*rnorm(N,mean=0,sd=1))
  Xt=cumsum(x)
  plot(t,Xt,type='l',col = rep(1:3, each = 10),xlab="t=[0,T]",ylab = "B(t,ω)")
}

例如对于 brownian(1,1000) 我得到:

对于 brownian(10,1000) 我得到:

如您所见,我得到黑色图表。我必须在一张图上绘制这些轨迹(每条轨迹应该有不同的颜色)。当它需要几个轨迹时,它应该是这样的:

你有什么建议我如何在一张图上绘制这些曲线并且每条曲线都有不同的颜色?

提前致谢

【问题讨论】:

    标签: r plot curve


    【解决方案1】:

    您可以通过修改函数并使用ggplot() 制作图表来轻松完成此操作。下面的函数将ntimes 作为参数指定您想要进行模拟的次数。然后它使用ggplot() 来制作图表。如果你愿意,你可以调整函数的内部结构,让它产生一个不同的图。

    brownian <- function(T,N, ntimes){
      if((length(N) != length(T)) & length(N) != 1){
        stop("N has to be either length of T or 1\n")
      }
      alpha=0
      sigma=1
      if(length(N) == 1 & length(T) > 1)N <- rep(N, length(T))
      dat <- NULL
      for(i in 1:ntimes){
        delta_t=T/N  
        t=seq(0,T,by=delta_t)
        #x=c(0,alpha*delta_t+sigma*sqrt(delta_t)*rnorm(N,mean=0,sd=1))
        x=c(0,alpha*delta_t+sqrt(delta_t)*rnorm(N,mean=0,sd=1))
        Xt=cumsum(x)
        dat <- rbind(dat, data.frame(xt=Xt, t=t, n=i))
      }
      require(ggplot2)
      ggplot(dat, aes(x=t, y=xt, colour=as.factor(n))) + 
        geom_line(show.legend=FALSE) + 
        labs(x="t=[0,T]",y = "B(t,ω)", colour="T") + 
        theme_classic()
    }
    brownian(10,1000, 5)
    

    【讨论】:

      【解决方案2】:

      这是带有matplot 的基本 R 解决方案。它非常适合这种类型的绘图,因为它计算 x 和 y 轴范围并仅在一次调用中绘制所有线。它使用DaveArmstrong's 添加额外参数ntimes 的想法。此参数也用于配色方案。

      brownian <- function(T, N, ntimes){
        alpha <- 0
        sigma <- 1
        delta_t <- T/N
        t <- seq(0, T, by = delta_t)
        #x=c(0,alpha*delta_t+sigma*sqrt(delta_t)*rnorm(N,mean=0,sd=1))
        Xt <- replicate(ntimes,
                        cumsum(c(0, alpha*delta_t+sqrt(delta_t)*rnorm(N, mean = 0, sd = 1)))
        )
        matplot(t, Xt, 
                type = "l", lty = 1, 
                col = seq_len(ntimes),
                xlab = "t=[0,T]", ylab = "B(t,ω)")
      }
      
      set.seed(2020)
      brownian(1, 1000, 5)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多