【问题标题】:How to draw multiple filled confidence bands on one plot using R plotly如何使用 R plotly 在一个图上绘制多个填充的置信带
【发布时间】:2020-09-25 05:30:50
【问题描述】:

我尝试使用以下代码在一个绘图上绘制两个填充带,但 plotly 没有填充在正确的一对线之间。这样做的正确方法是什么?

如果知道如何指定理想的透明度来处理两个波段的重叠,我也将不胜感激。

require(plotly)
x <- c(1, 2, 1, 2)
g <- c('a','a','b','b')
y <- c(1, 2, 3, 4)
lo <- y - .1
hi <- y + .1

a <- plot_ly(x=x, y=y, group=g)
a <- add_trace(a, x=x, y=lo, group=g, fill='tonexty')
a <- add_trace(a, x=x, y=hi, group=g)
a

【问题讨论】:

    标签: r plotly


    【解决方案1】:

    我不完全确定您希望您的情节是什么样子,但您可以尝试使用geom_ribbon 函数在ggplot2 中创建情节。然后使用ggplotly 将绘图转换为plotly 图形:

    df <- data.frame(
      x, g, y, lo, hi
    )
    
    plot <- ggplot(data=df, aes(x=x, y=y, colour=g)) + geom_line(aes(x=x)) +
      geom_ribbon(aes(ymin=lo,ymax=hi), alpha=0.25) 
    
    ggplotly(plot)
    

    【讨论】:

    • 这是我一直使用的方法;我只是在我的一个 R 包中发现,将多个 plotly 图放在一起会导致部分图像丢失,我想直接使用 plotly 更好地控制输出。
    【解决方案2】:

    fill = "tonexty" 根据之前的跟踪进行填充。因此,让每个组从 hi 到 lo 填充的一种方法是明确地对调用进行排序:

    a <- plot_ly(x=x, y=y, group=g)
    a <- add_trace(a, x = x[g=="a"], y = lo[g=="a"], group = g[g=="a"])
    a <- add_trace(a, x = x[g=="a"], y = hi[g=="a"], group = g[g=="a"], fill = 'tonexty')
    a <- add_trace(a, x = x[g=="b"], y = lo[g=="b"], group = g[g=="b"])
    a <- add_trace(a, x = x[g=="b"], y = hi[g=="b"], group = g[g=="b"], fill = 'tonexty')
    

    指定透明度的一种方法是使用toRGB

    a <- plot_ly(x=x, y=y, group=g)
    a <- add_trace(a, x = x[g=="a"], y = lo[g=="a"], group = g[g=="a"])
    a <- add_trace(a, x = x[g=="a"], y = hi[g=="a"], group = g[g=="a"], fill = 'tonexty',
             fillcolor = toRGB("red", 0.1))
    a <- add_trace(a, x = x[g=="b"], y = lo[g=="b"], group = g[g=="b"])
    a <- add_trace(a, x = x[g=="b"], y = hi[g=="b"], group = g[g=="b"], fill = 'tonexty',
             fillcolor = toRGB("blue", 0.7))
    a
    

    【讨论】:

    • 感谢您理解音调的误解。有没有办法让 group= 或 color= 完成自动分成 2 个组的工作?
    • @FrankHarrell 嗯,我不确定是否有。也许有办法使用lapply,但我得考虑一下。
    • 这意味着add_trace 在开始一个新多边形时不是“组感知”的,对吧?
    • @FrankHarrell 好像是这样。
    • @FrankHarrell FWIW,这将允许您不明确指定每个组,但这显然效率低下且不理想。不确定它是否对您有用:a &lt;- lapply(unique(g), function(ii) { a &lt;&lt;- add_trace(a, x = x[g==ii], y = lo[g==ii], group = g[g==ii]); a &lt;&lt;- add_trace(a, x = x[g==ii], y = hi[g==ii], group = g[g==ii], fill = 'tonexty') }); a[[length(a)]]
    【解决方案3】:
    x <- c(1, 2, 1, 2)
    g <- c('a','a','b','b')
    y <- c(1, 2, 3, 4)
    lo <- y - .1
    hi <- y + .1
    df <- cbind.data.frame(x,y,g,lo,hi)
    g.uni <- unique(df$g)
    
    fig <- df %>%
            plot_ly(type = "scatter",
            mode = "lines",
            showlegend = FALSE)
    
    for(i in g.uni){
          fig <- fig  %>%
                   add_fun(function(plot) {
                      plot %>% 
                      filter(g == i) %>%
                      add_ribbons(x = ~x,
                          ymin = ~lo,
                          ymax = ~hi
                      ) %>%
                      add_lines(
                       x = ~x,
                       y = ~y,
                       line = list(
                                color = "black",
                                dash = "dot"
                                )
                             )
                      }
                   )
    }
    print(fig)
    

    enter image description here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多