簡體   English   中英

如何在 R 中定義 function 的圖形上 plot 幾條曲線?

[英]How to plot several curves on one graph with defined function in R?

我需要在一張圖上 plot 幾條曲線。 我從 function 獲得了布朗模擬的軌跡:

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) 我得到:

如您所見,我得到黑色圖表。 我必須在一張圖上 plot 這些軌跡(每個軌跡應該有不同的顏色)。 當它需要幾個軌跡時,它應該看起來像:

你有什么建議我怎么能 plot 這些曲線在一張圖上,每條曲線都有不同的顏色?

提前致謝

您可以通過修改 function 並使用ggplot()制作圖表來輕松完成此操作。 下面的 function 將ntimes作為參數,指定您想要進行模擬的次數。 然后它使用ggplot()來制作圖表。 如果您願意,您可以調整 function 的內部結構,讓它產生不同的外觀 plot。

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)

在此處輸入圖像描述

這是帶有matplot的基本 R 解決方案。 它非常適合這種類型的 plot,因為它僅在一次調用中計算 x 和 y 軸范圍並繪制所有線。 它使用了 DaveArmstrong 的想法,即添加一個額外的參數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)

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM