【问题标题】:Plotly add_trace using lapply or for loops doesnt work使用 lapply 或 for 循环绘制 add_trace 不起作用
【发布时间】:2017-09-14 17:43:16
【问题描述】:

使用数据框列表时如何在循环中添加_trace

我使用下面的代码不断得到以下信息

df1<-c(seq(1:32))
df2<-df*2
df3<-df2*8
dff1<-sqrt(df1)
dff2<-sqrt(df2)
dff3<-sqrt(df3)


a<-cbind.data.frame(df1,dff1)
b<-cbind.data.frame(df2,dff2)
c<-cbind.data.frame(df3,dff3)
colnames(a)<-c("df1","df2")
colnames(b)<-c("df1","df2")
colnames(c)<-c("df1","df2")

df<-list()
df[[1]]<-a
df[[2]]<-b
df[[3]]<-c

pl<-plot_ly()
for(i in 1:3){

  pl<- add_trace(pl,data=df[[i]],x=~df[[i]]$df1,y=~df[[i]]$df2,mode='lines',type='scatter') 


}

pl

当使用 lapply 而不是 for 循环时,我得到三个单独的图而不是一个三线图

pl<-plot_ly()

pl<-lapply(1:3, function(i){

  pl<- pl%>%
    add_trace(data=df[[i]],x=~df[[i]]$df1,y=~df[[i]]$df2,mode='lines',type='scatter',inherit = TRUE) 


})
pl

【问题讨论】:

  • add_trace 中使用evaluate = TRUE
  • 我从其他帖子中知道 add_trace 中的 evaluate = TRUE。但这不起作用
  • 我认为您的问题在于对 xy 使用美元符号表示法,而不是直接引用变量。请改用data=df[[i]],x=~df1,y=~df2。由于 plotly 4.0 评估是强制的,所以 evaluation = TRUEno longer needed
  • 这适用于 for 循环。我使用 lapply 做了同样的改变,仍然产生三个单独的图表。有没有办法让 lapply 像时尚一样循环添加到 add_trace 而不是创建三个单独的图表
  • 这三个独立的图表与apply 家族的工作方式有关。请参阅here,了解如何通过assign&lt;&lt;- 更改函数范围之外的内容,尽管在此任务中坚持循环是一个简单的选择。

标签: r plotly


【解决方案1】:

虽然其他用户已经正确地指出,这可以简单地通过 for 循环来完成,但我想我还是回答一下如何使用 lapply() 来解决以后遇到这个问题的人。

这可以通过 lapply() 使用 get() 方法来完成,它允许您在检索变量时指定环境。用 invisible() 包裹你的 lapply 可以防止循环在运行时将中间体打印到你的控制台/查看器。

代码如下:

df1<-c(seq(1:32))
df2<-df1*2
df3<-df2*8
dff1<-sqrt(df1)
dff2<-sqrt(df2)
dff3<-sqrt(df3)


a<-cbind.data.frame(df1,dff1)
b<-cbind.data.frame(df2,dff2)
c<-cbind.data.frame(df3,dff3)
colnames(a)<-c("df1","df2")
colnames(b)<-c("df1","df2")
colnames(c)<-c("df1","df2")

df<-list()
df[[1]]<-a
df[[2]]<-b
df[[3]]<-c

pl<-plot_ly()

invisible(lapply(seq_along(df), FUN = function(i) {
  pl <<- get("pl", envir = globalenv()) %>% 
    add_trace(pl,data=df[[i]],x=~df[[i]]$df1,y=~df[[i]]$df2,mode='lines',type='scatter')  
}))

pl

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 2016-12-03
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多