I have a very simple timeline I've created using the vistime library in R:
library(vistime)
library(plotly)
data <- read.csv(text="event,group,start,end,color,line.color
RedBorder,Project,2016-12-22,2016-12-22,#e8a735,#FF0000
BlueBorder,Meetings,2012-03-15,2012-03-15,#e8a735,#0000ff
BlueBorder,Meetings,2017-01-12,2017-01-12,#e8a735,#0000ff
BlueBorder,Meetings,2019-09-12,2019-09-12,#e8a735,#0000ff
BlueBorder,Meetings,2018-08-15,2017-08-15,#e8a735,#0000ff
RedBorder,Meetings,2017-01-15,2017-01-15,#e8a735,#FF0000")
#Ordering the data, oldest to newest -- this sorts correctly
data <- data[order(data$start),]
p <- vistime(data)
pb <- plotly_build(p)
#The plot's dates are not ordered
pb$x$data[[2]]$x
#Attempting to order the plot's data. These are the date elements. No luck ordering.
pb[order(pb$x$data[[2]]$x)]
for (i in 1:length(pb$x$data)) {
if (pb$x$data[[i]]$mode == "markers") pb$x$data[[i]]$marker$line$color<- data$line.color
}
pb
I'm trying to get the line color to match what is in the line.color column, but as you see, it's not assigning the correct line color to the points. For example, RedBorder should have red outlines, and BlueBorder events should have blue outlines.
This was tricky! It seems you are getting burned by internal sorting of the data (based on time) inside the "built" Plotly object relative to your input data.
Basically, the
data$line.colordoes not have the right sort order so the colors were not being mapped to the correct markers.Simply pre-ordering your data based on Date e.g.
order(data$start)fixes the problem. Movesdatarow 4 to position 3. EDIT: it appears that sort order may be more complicated, so usematchto set the order ofdataafter makingpbFinal edit with more complex data: I originally posted edits without your complete update. You need to know what index of
pb$x$datacontains your marker X-positions. In your first example it was index 2, in your new example it is index 4.