Plotly: add_trace in a loop

后端 未结 5 984
一整个雨季
一整个雨季 2020-12-17 10:09

I\'m trying to add_trace ad each loop, but I get only one plot with multiplies lines on over each other.

mean <- -0.0007200342
sd   <- 0.3403711
N=10
T         


        
相关标签:
5条回答
  • 2020-12-17 10:42

    Nasty, but works:

    mean <- -0.0007200342
    sd   <- 0.3403711
    N=10
    T=1
    Delta = T/N
    
    W = c(0,cumsum( sqrt(Delta) * rnorm(N, mean=mean, sd=sd)))
    t <- seq(0,T, length=N+1)
    
    
    for(i in 1:5){
    
      W <- c(0,cumsum( sqrt(Delta) * rnorm(N, mean=mean, sd=sd)))
    
      assign(paste("W_",i,sep=""),W)
      assign(paste("Name_", i, sep=""), paste("Name",i,sep=""))
      if(i==1){
        pString<-"p<-plot_ly(x = t, y = W_1, name='W1')"
      } else {
        pString<-paste(pString, " %>% add_trace(x=t, y =",  eval(paste("W", i, sep="_")),", name=", eval(paste("Name", i, sep="_")), ")", sep="")
      }
    
    }
    eval(parse(text=pString))
    print(p)
    
    0 讨论(0)
  • 2020-12-17 10:46

    It is described here : http://www.r-graph-gallery.com/129-use-a-loop-to-add-trace-with-plotly/

    save your plot in a variable, and then do add_trace :

    p <- plotly(...)
    
    p<- add_trace(p, ...)
    
    0 讨论(0)
  • 2020-12-17 10:47

    Use evaluate = TRUE in add_trace.

    0 讨论(0)
  • 2020-12-17 10:50

    The plot_ly and add_trace functions have an evaluation = FALSE option that you can change to TRUE, which should fix the scope issues.

    0 讨论(0)
  • 2020-12-17 10:51

    I'd do this like this:

    mean <- -0.0007200342
    sd   <- 0.3403711
    N=10
    T=1
    Delta = T/N
    
    # a list with the trace Y values
    Ws <- lapply(
      1:15,
      function(idx){
        c(0,cumsum( sqrt(Delta) * rnorm(N, mean=mean, sd=sd)))
      } 
    )
    
    # this could be a list with the trace X values, but is just a seq
    t <- seq(0,T, length=N+1)
    
    # a list with plotly compliant formatted objects
    formattedW <- lapply(
      seq_along(Ws),
      function(idx, datasetY, datasetX){
        return(list( x = datasetX, y = datasetY[[idx]], type="scatter", mode = 'lines+markers'))
      },
      datasetX = t,
      datasetY = Ws
    )
    
    # Reduce the list of plotly compliant objs, starting with the plot_ly() value and adding the `add_trace` at the following iterations
    Reduce(
      function(acc, curr){
        do.call(add_trace,c(list(p=acc),curr))
      },
      formattedW,
      init=plot_ly()
    )
    
    0 讨论(0)
提交回复
热议问题