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.color
does 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. Movesdata
row 4 to position 3. EDIT: it appears that sort order may be more complicated, so usematch
to set the order ofdata
after makingpb
Final edit with more complex data: I originally posted edits without your complete update. You need to know what index of
pb$x$data
contains your marker X-positions. In your first example it was index 2, in your new example it is index 4.