2015-12-09 30 views
12

Sto provando ad aggiungere_trace ad ogni ciclo, ma ottengo solo un grafico con linee multiple sovrapposte l'una sull'altra.Plotly: add_trace in un loop

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) 

p<-plot_ly(y=W, x=t) 

for(i in 1:5){ 

    W <- c(0,cumsum(sqrt(Delta) * rnorm(N, mean=mean, sd=sd))) 
    p<-add_trace(p, y=W) 

} 
print(p) 

enter image description here

+0

La mia ipotesi è un problema di scoping. Quando si definisce 'y = W',' W' viene prima trovato nell'ambiente della trama. Utilizzando direttamente 'p <-add_trace (p, y = c (0, cumsum (sqrt (Delta) * rnorm (N, mean = mean, sd = sd))))' risolve il problema, ma immagino tu stia cercando una soluzione più generale. – Axeman

+2

Anche interessato a una soluzione qui ... sembra essere un problema generale di trama? Voglio dire che la soluzione di cui sopra funziona per questo semplice esempio, ma non se hai grandi dataframe. Non appena si dispone della variabile di ciclo soom o di qualsiasi altra cosa nella chiamata plot, prende solo l'ultima variabile del loop ... – MichiZH

risposta

1

Brutto, ma funziona:

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

I plot_ly e add_trace funzioni hanno un'opzione evaluation = FALSE che si può cambiare a TRUE, che dovrebbe risolvere i problemi di portata.

0

farei questo in questo modo:

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