Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add multiple lines to a plot_ly graph with add_trace

Tags:

r

plotly

I found an example to add lines to a plot_ly plot by using the add_trace command. How can I add a list of lines to plot without using add_trace multiple times?

I tried a for loop to add the traces but this doesn't work as expected.

my_lines <- list(
  list(x=1:10, y=2:11, color='red'),
  list(x=1:10, y=0:9, color='blue'),
  list(x=1:10, y=3:12, color='green')
)
p <- plot_ly()
p
for(line in my_lines) {  p <- add_trace(p, y=line[['y']], x=line[['x']], 
                 marker=list(color=line[['color']]))
}
p

But this for example works as expected.

p <- plot_ly()
p <- add_trace(p, y=my_lines[[1]][['y']], x=my_lines[[1]][['x']],
               marker=list(color=my_lines[[1]][['color']]))
p <- add_trace(p, y=my_lines[[2]][['y']], x=my_lines[[2]][['x']],
               marker=list(color=my_lines[[2]][['color']]))
p <- add_trace(p, y=my_lines[[3]][['y']], x=my_lines[[3]][['x']],
               marker=list(color=my_lines[[3]][['color']]))
p
like image 665
drmariod Avatar asked Aug 08 '16 12:08

drmariod


2 Answers

I believe with the release of plotly 4.0 calling any of the add_* family of functions forces evaluation so there is no need to call evaluate = T anymore

So, something like this should work fine:

devtools::install_github("ropensci/plotly")
library(plotly)

p <- plot_ly()

for(i in 1:5){
  p <- add_trace(p, x = 1:10, y = rnorm(10), mode = "lines")
}

p

enter image description here

like image 116
royr2 Avatar answered Oct 05 '22 21:10

royr2


You can transform your inputs into a long-form data frame first, then plot using the split argument.

library(plotly)
library(reshape2)

my_lines = data.frame(x = 1:10, red = 2:11, blue = 0:9, green = 3:12)
my_lines_long = reshape2::melt(my_lines, id.vars = "x")
fig = plotly::plot_ly(my_lines_long, x = ~x, y = ~value, split = ~variable,
                      marker=list(color=~variable))
fig
like image 34
Igor Pozdeev Avatar answered Oct 05 '22 20:10

Igor Pozdeev