[英]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.