【问题标题】:R plot_ly(): adding multiple vertical lines to a plot based on time dataR plot_ly():根据时间数据在绘图中添加多条垂直线
【发布时间】:2020-12-21 14:14:06
【问题描述】:

我需要一些帮助来根据时间数据绘制多条垂直线。 我的带有时间数据的数据框定义如下:

v.years <- as.Date(c("2004-01-01", "2005-01-01", "2006-01-01", "2007-01-01", "2008-01-01", "2009-01-01",
                     "2010-01-01", "2011-01-01", "2012-01-01", "2013-01-01", "2014-01-01", "2015-01-01",
                     "2016-01-01", "2017-01-01", "2018-01-01", "2019-01-01", "2020-01-01", "2021-01-01"))
df.dateYears <- as.data.frame(v.years)

我的情节代码如下所示:

p <- plot_ly(dt.allDataFvsS, x = dt.allDataFvsS$date, y = dt.allDataFvsS$meanDifference, mode = 'lines',
             type = 'scatter', line = list(color = "#007d3c"), text = ~forwardProduct, 
             hovertemplate = paste("<b>%{text} vs. Spot</b><br>", "%{xaxis.title.text}:  %{x}<br>",
                                   "%{yaxis.title.text}:  %{y}<br><extra></extra>")) %>%
     add_trace(x = as.Date("2018-10-01"), type = 'scatter', mode = 'lines',
               line = list(color = "red", dash = "dash"), text = "Price Zone Separation",
               hovertemplate = paste("<b>%{text}</b><br>", "%{xaxis.title.text}:  %{x}<br><extra></extra>")) %>%
     layout(title = "Average Price Difference Forward vs. Spot", xaxis = list(title = "Date"), 
            yaxis = list(title = "EUR/MWh"), showlegend = FALSE) %>%

正如您在上面的代码中看到的那样,我知道如何在单个日期执行此操作,其中我使用了以下代码:

trace_add(x = as.Date("2018-10-01"), ...)

我的情节实际上是这样的: Rplot

所以,我的问题是:如何绘制与我的数据框df.dateYears 中的时间数据完全匹配的多条垂直线?

【问题讨论】:

    标签: r dataframe plotly r-plotly


    【解决方案1】:

    我建议使用循环和您在问题中提到的原始日期向量来使用这种方法。我添加了示例数据并修改了您的日期向量,但使用您的原始数据它必须可以正常工作:

    library(plotly)
    library(dplyr)
    set.seed(123)
    #Sample data
    mydata <- data.frame(date=seq(as.Date('2017-01-01'),as.Date('2021-12-31'),length.out = 30),
                         meanDifference=round(runif(30,0,15),0),stringsAsFactors = F)
    #Plot
    p <- plot_ly(mydata, x = ~date, y = ~meanDifference, mode = 'lines',
                 type = 'scatter', line = list(color = "#007d3c"), text = ~meanDifference)
    #New data
    v.years <- as.Date(c("2017-01-01", "2018-01-01", "2019-01-01", "2020-01-01", "2021-01-01"))
    #Add lines with loop
    for(i in 1:length(v.years))
    {
      p <- p %>%
        add_trace(x = v.years[i], type = 'scatter', mode = 'lines',
                  line = list(color = "red", dash = "dash"), text = "Price Zone Separation")
    }
    

    输出:

    【讨论】:

    • 我对您的解决方案还有另一个问题:我正在使用您的版本,但不幸的是它没有绘制足够长的垂直线。我的意思是,y 轴上的线从大约 28 开始到 57。然而,在某些情况下,我的图形超过了 65(y 轴)。我想在 cmets 中发布该情节的图片,但您不能。
    • @Michi 一定是布局的问题,你必须检查布局的设置并添加到循环中。在您的情况下可以做什么!
    【解决方案2】:

    您可以简单地在循环中使用add_trace

    library(plotly)
    
    dates <- seq(from = as.Date("2004-01-01"), to = as.Date("2020-12-31"), by = 12)
    dt.allDataFvsS <- data.frame(date = dates, meanDifference = seq_along(dates))
    
    v.years <- as.Date(c("2004-01-01", "2005-01-01", "2006-01-01", "2007-01-01", "2008-01-01", "2009-01-01",
                         "2010-01-01", "2011-01-01", "2012-01-01", "2013-01-01", "2014-01-01", "2015-01-01",
                         "2016-01-01", "2017-01-01", "2018-01-01", "2019-01-01", "2020-01-01", "2021-01-01"))
    df.dateYears <- as.data.frame(v.years)
    
    
    p <- plot_ly(dt.allDataFvsS, x = dt.allDataFvsS$date, y = dt.allDataFvsS$meanDifference, mode = 'lines',
                 type = 'scatter', line = list(color = "#007d3c"), text = ~"forwardProduct", 
                 hovertemplate = paste("<b>%{text} vs. Spot</b><br>", "%{xaxis.title.text}:  %{x}<br>",
                                       "%{yaxis.title.text}:  %{y}<br><extra></extra>")) %>%
      add_trace(x = as.Date("2018-10-01"), type = 'scatter', mode = 'lines',
                line = list(color = "red", dash = "dash"), text = "Price Zone Separation",
                hovertemplate = paste("<b>%{text}</b><br>", "%{xaxis.title.text}:  %{x}<br><extra></extra>")) %>%
      layout(title = "Average Price Difference Forward vs. Spot", xaxis = list(title = "Date"), 
             yaxis = list(title = "EUR/MWh"), showlegend = FALSE)
    
    
    for(v.year in df.dateYears$v.years){
      p <- add_trace(p, x = as.Date(v.year, origin = "1970-01-01"), type = 'scatter', mode = 'lines',
                line = list(color = "red", dash = "dash"), text = "Price Zone Separation",
                hovertemplate = paste("<b>%{text}</b><br>", "%{xaxis.title.text}:  %{x}<br><extra></extra>"))
    }
    
    p
    

    【讨论】: