【问题标题】:Mult-Color Line Plot in R Plotly based on Y Value基于 Y 值的 R Plotly 中的多色线图
【发布时间】:2017-10-14 18:56:25
【问题描述】:

我想在 R 中创建一个 Plotly 图,当它为正时为绿色,当它为负时为红色。

我尝试使用两条单​​独的轨迹来执行此操作,从而生成下面不连续的第一个图。然后,我尝试使用由下面的代码创建的颜色列创建彩色跟踪。这些是我能想到的使用当前版本的 plotly 的唯一实现。

> str(results)
'data.frame':   804 obs. of  7 variables:
 $ date  : Date, format: "2014-03-06" "2014-03-07" "2014-03-10" ...
 $ 5yr   : num  32.9 32.5 32.9 32.8 32.8 ...
 $ 3y5   : num  32.4 32.1 32.5 32.4 32.4 ...
 $ spread: num  -0.488 -0.431 -0.438 -0.388 -0.452 ...
 $ pos   : num  NA NA NA NA NA NA NA NA NA NA ...
 $ neg   : num  -0.488 -0.431 -0.438 -0.388 -0.452 ...
 $ color : chr  "red" "red" "red" "red" ...

results$spread <- results[,3] - results[,2]
results$neg <- ifelse(results$spread < 0 , results$spread, NA)
results$pos <- ifelse(results$spread >= 0 , results$spread, NA)

plot_ly(results,
    x = ~dates,
    y = ~pos,
    type = 'scatter',
    mode = 'lines',
    line = list(color = 'green')) %>%
  add_trace(results,
            x = ~dates,
            y = ~neg,
            type = 'scatter',
            mode = 'lines',
            line = list(color = 'red')) %>%
  layout(xaxis = list(title = 'Date'),
         yaxis = list(title = 'Price'))

plot_ly(results,
    x = ~dates,
    y = ~spread,
    type = 'scatter',
    mode = 'lines',
    color = ~color) %>%
  layout(xaxis = list(title = 'Date'),
         yaxis = list(title = 'Price'))

【问题讨论】:

    标签: r plotly


    【解决方案1】:

    这是一个有趣的。但过了一会儿,我意识到你可以通过在绘图的每个过零处插入一个零值来得到你想要的:

    我认为代码是不言自明的(使用 cmets)

    这是代码 - (带有一些伪造的数据):

    library(plotly)
    
    #fake up some data
    set.seed(123)
    n <- 100
    sdate <- as.Date("2014-03-06")
    dt <- seq.Date(sdate,by="days",length.out=n)
    results <- data.frame(dates=dt,v1=rnorm(n,32.6,0.2),v2=rnorm(n,32.6,0.2))
    results$spread <- results[,3] - results[,2]
    
    
    # find all the zero crossings
    spd <- results$spread
    lagspd <- c(spd[1],spd[1:(length(spd)-1)])
    crs <- sign(spd)!=sign(lagspd)
    results$crs <- crs
    
    # now insert a zero row where there is a crossing
    insertZeroRow <- function(df,i){ 
      n <- nrow(df)
      ndf1 <- df[1:i,] # note these overlap by 1
      ndf2 <- df[i:n,] # that is the row we insert
      ndf1$spread[i] <- 0
      ndf <- rbind(ndf1,ndf2)
    }
    
    
    i <- 1
    while(i<nrow(results)){
      if (results$crs[i]){
        results <- insertZeroRow(results,i)
        i <- i+1
      }
      i <- i+1
    }
    
    # plot it now
    
    results$neg <- ifelse(results$spread <= 0 , results$spread, NA)
    results$pos <- ifelse(results$spread >= 0 , results$spread, NA)
    
    plot_ly(results,
            x = ~dates,
            y = ~pos,
            type = 'scatter',
            mode = 'lines',
            line = list(color = 'green')) %>%
      add_trace(results,
                x = ~dates,
                y = ~neg,
                type = 'scatter',
                mode = 'lines',
                line = list(color = 'red')) %>%
      layout(xaxis = list(title = 'Date'),
             yaxis = list(title = 'Price'))
    

    结果如下:

    请注意,您可以通过插入 datesspread 值来获得正确的 x 轴交叉点来使其变得更好,但我认为在大多数情况下它不会产生巨大的差异。如果你这样做了,你还需要一个可以表示一天中几个小时的日期类型(如 as.POSIXct),以便能够指定正确的 x 轴值。

    更新:

    为了消除任何混淆,添加零行是必要的。如果你注释掉insertZeroRow 调用,你会得到这个:

    【讨论】:

    • 所以这个问题似乎源于results$posresults$neg系列的条件赋值?
    • 不,不是。它源于这样一个事实,即 NA 应该表示为线条中的间隙。因此,您必须将曲线向下延伸到零(在 x 轴上)。
    • 这很好用,但对于大型系列,使用 while 循环插入的问题会很慢,特别是如果有很多交叉 x 轴。
    • 这个答案的问题也是你在每个过零处添加一个数据点,这会导致图表不平滑,因为航路点必须经过零
    • 嗯,是的,但如果这是一个问题,您可以进行一些小修改,使其相交于使其平滑的点。我什至在答案中提到了这一点。
    【解决方案2】:

    基本上你可以在这部分代码中改变你的第一个实现:

    results$spread <- results[,3] - results[,2]
    results$neg <- ifelse(results$spread < 0 , results$spread, NA)
    results$pos <- ifelse(results$spread >= 0 , results$spread, NA)
    

    在第二行代码中添加=:

    results$spread <- results[,3] - results[,2]
    results$neg <- ifelse(results$spread <= 0 , results$spread, NA)
    results$pos <- ifelse(results$spread >= 0 , results$spread, NA)
    

    尝试一下,它应该可以消除不连续性

    【讨论】:

    • 不能那样工作。用我完整的工作样本试试吧。注释掉insertZeroRow 看看你会得到什么。
    • 以我的第二个情节为例。
    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 2013-06-26
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多