【问题标题】:Specify line color in vistime/plotly timeline in R在R中的vistime / plotly时间轴中指定线条颜色
【发布时间】:2023-03-29 08:31:01
【问题描述】:

我使用 R 中的 vistime 库创建了一个非常简单的时间线:

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

我试图让线条颜色与line.color 列中的颜色相匹配,但正如您所见,它没有为点分配正确的线条颜色。例如,RedBorder 应该有红色轮廓,BlueBorder 事件应该有蓝色轮廓。

【问题讨论】:

    标签: r plotly vistime


    【解决方案1】:

    这很棘手!相对于您的输入数据,“构建”的 Plotly 对象中的数据(基于时间)的内部排序似乎让您感到焦头烂额。

    基本上,data$line.color 没有正确的排序顺序,因此颜色没有映射到正确的标记。

    只需根据日期预购您的数据,例如order(data$start) 解决了这个问题。将data第4行移动到位置3。编辑:看起来排序顺序可能更复杂,所以在制作pb之后使用match设置data的顺序

    使用更复杂的数据进行最终编辑: 我最初在没有您完整更新的情况下发布了编辑。您需要知道 pb$x$data 的哪个索引包含您的标记 X 位置。在您的第一个示例中,它是索引 2,在您的新示例中,它是索引 4。

    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")
    
    
    data <- as.data.frame(data)  
    data$color <- rgb(1,1,1,0)
    
    p <- vistime(data)
    pb <- plotly_build(p)
    
    
    for (i in 1:length(pb$x$data)) {
      if (pb$x$data[[i]]$mode == "markers") {
        data <- data[match(strftime(pb$x$data[[i]]$x, "%Y-%m-%d"), data$start),]
        pb$x$data[[i]]$marker$line$color<- data$line.color
      }
    }
    #> [1] 4
    
    

    【讨论】:

    • 非常感谢。它在示例中有效,但不是我的实际代码,它有点复杂。我相信实际 pb 列表中的开始日期需要按日期排序才能使其正常工作。我该怎么做。什么时候做: pb$x$data[order(pb$x$data$start),] 我得到错误: 顺序错误(pb$x$data$start) : argument 1 is not a vector
    • pb中的数据已经按日期排序了,需要排序的是输入数据框(即你传递给vistime()的对象),因为后面用它来赋值pb 对象之外的颜色
    • Andrew - 重新发布一个示例,以便您可以看到它仍然无法正常工作-
    • 您可能需要根据pb 对象确定顺序,然后相应地调整您指定颜色的顺序。如果您的数据更复杂,可能很难复制vistime() 中正在进行的内部排序,但原则上您应该能够匹配
    • 感谢您的所有帮助。我想我得到了它的工作,我不得不做一些日期格式,但你的解决方案似乎是在正确的轨道上。不过,我确实必须修改您的代码以使其与我的示例一起工作: data
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2021-03-12
    • 2017-12-05
    • 2015-11-24
    • 1970-01-01
    • 2016-06-06
    • 2018-02-19
    相关资源
    最近更新 更多