Plotly:循环中的 add_trace

Posted

技术标签:

【中文标题】Plotly:循环中的 add_trace【英文标题】:Plotly: add_trace in a loop 【发布时间】:2016-03-15 04:24:24 【问题描述】:

我正在尝试在每个循环中添加跟踪广告,但我只得到一个图,其中多个线相互叠加。

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)

【问题讨论】:

我的猜测是范围界定问题。在定义y=W 时,首先在绘图环境中找到W。直接使用p&lt;-add_trace(p, y=c(0,cumsum( sqrt(Delta) * rnorm(N, mean=mean, sd=sd)))) 可以解决问题,但我想您正在寻找更通用的解决方案。 也对这里的解决方案感兴趣..似乎是一个普遍的情节问题?我的意思是上述解决方案适用于这个简单的示例,但如果您有大数据框则不行。一旦你有 soom 循环变量或 plotly 调用中的任何内容,它只需要最后一个循环变量...... 【参考方案1】:

讨厌,但有效:

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)

【讨论】:

【参考方案2】:

plot_lyadd_trace 函数有一个 evaluation = FALSE 选项,您可以将其更改为 TRUE,这应该可以解决范围问题。

【讨论】:

【参考方案3】:

add_trace 中使用evaluate = TRUE

【讨论】:

【参考方案4】:

我会这样做:

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

【讨论】:

【参考方案5】:

这里是这样描述的: http://www.r-graph-gallery.com/129-use-a-loop-to-add-trace-with-plotly/

将绘图保存在变量中,然后执行 add_trace :

p <- plotly(...)

p<- add_trace(p, ...)

【讨论】:

以上是关于Plotly:循环中的 add_trace的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Plotly Javascript 显示循环进度图

plotly dash:创建多个回调(带循环?)

调试 Plotly 表面标题未更新

运行程序时图表不显示(PLOTLY)

在 jupyter 中 [每隔几秒] 更新 plotly 图形

ImportError:LinuxMint17.3 中的“没有名为 plotly.plotly 的模块”