繁体   English   中英

plot_ly() 和 shiny:更改交互环境中区域填充的透明度

[英]plot_ly() and shiny: change transparency of area fill in interactive environment

我想要达到的目标:
一条线 plot 线下方有填充区域。 线条(或标记)的不透明度应为 1,填充颜色的不透明度应为 0.1 左右,因为 3 到 10 条迹线将在相同的 plot 中结束。

我对 plot_ly 还是很陌生,所以我可能遗漏了一些明显的东西。 但是,我知道 fillcolor 参数让我指定 rgba 颜色。 我进一步模糊地了解 layout.colorway 获得匹配填充颜色的潜力。
我希望看到不需要手动调整的解决方案,因为跟踪是在 shiny 应用程序中交互式添加的。 下面是一个我想要的玩具示例。 for 循环知道 plot 中已经有多少跟踪,但这是交互式 function 没有的信息。 我怎样才能绕过这个(最好不要在 shiny 应用程序中添加计数器)?

感谢您的任何建议!

library(plotly)
dat <- list(x =c(1,2,3),
            y1=c(3,5,6),
            y2=c(7,1,3),
            y3=c(1,4,7)
       )
## default colors of layout.colorway
pltColors  <- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd",
                "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf")
## make them tranparent
pltColorsA <- paste0(pltColors,"20")


plt <- plot_ly(df, type="scatter", mode='lines+markers',
               x=~x, y=~y1,
               span=5,
               fill='tozeroy',
               fillcolor=pltColorsA[1])
for(i in 2:4){
  yi <- df[,i]
  plt <-  add_trace(plt,data=df, x=~x, y=yi,
                           fill='tozeroy',
                           fillcolor=pltColorsA[i])
}
plt

编辑
这是 shiny 应用程序的最小示例。 用户通过单击动作按钮来添加跟踪。 区域填充的 0.5 的默认透明度使 plot 在几条痕迹后看起来很混乱,所以我想将透明度设置为大约 0.1,就像上面的 plot 一样。 我不知道如何实现这一点,因为 add_trace() 不知道(也不需要知道)有关过去跟踪的任何信息。

library(shiny)
library(plotly)
if (interactive()) {

ui <- fluidPage(
    actionButton('addTrace','Klick Me to add a trace!'),
    plotlyOutput('plt')
)

server <- function(input, output) {
  plt  <- plot_ly(type="scatter",
                  mode="lines+markers",
                  fill="tozeroy",
                  span=I(5))
  reac <- reactiveValues(plotlyObj = plt)

  observeEvent(input$addTrace,
      reac$plotlyObj <- add_trace(reac$plotlyObj, x=1:4, y=sample(1:10,4))
  )
  output$plt <- renderPlotly(reac$plotlyObj)

}
shinyApp(ui = ui, server = server)
}

在你澄清了你想要达到的目标之后,也许这会满足你的需求。 这篇文章之后,我在您的 shiny 应用程序中添加了一个计数器,该应用程序跟踪跟踪并相应地选择 colors。 10 次跟踪后,colors 被回收。

library(shiny)
library(plotly)
if (interactive()) {
  
  pltColors  <- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd",
                  "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf")
  ## make them tranparent
  pltColorsA <- paste0(pltColors,"1A")
  
  ui <- fluidPage(
    actionButton('addTrace','Klick Me to add a trace!'),
    plotlyOutput('plt')
  )
  
  server <- function(input, output) {
    plt  <- plot_ly(type="scatter",
                    mode="lines+markers",
                    fill="tozeroy",
                    span=I(5))
    reac <- reactiveValues(plotlyObj = plt)
    
    vals <- reactiveValues(counter = 0)
    
    observeEvent(input$addTrace, {
      vals$counter <- vals$counter + 1
      message(glue::glue("Counter: {vals$counter}"))
      reac$plotlyObj <- add_trace(reac$plotlyObj, 
                                  x=1:4, 
                                  y=sample(1:10,4),
                                  color = I(pltColors[(vals$counter - 1) %% 10 + 1]),
                                  fillcolor = pltColorsA[(vals$counter - 1) %% 10 + 1])
    })
    
    output$plt <- renderPlotly(reac$plotlyObj)
    
  }
  shinyApp(ui = ui, server = server)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM