r - 使用 plotlyProxyInvoke 在不调整绘图大小的情况下向绘图添加垂直线

标签 r shiny plotly

我正在尝试使用 addTraces 方法向现有的 plotly plot 添加一条垂直线。我想了解为什么新的垂直线会添加到第一条迹线所在位置的右侧两个单位。

解决此问题可能会解决我原来的问题(问题标题),即在添加新轨迹时避免绘图调整大小/向右移动。

这是我正在尝试做的一个例子:

library(shiny)
library(plotly)

ui <- bootstrapPage(
  plotlyOutput("plot")
)

myvec <- rnorm(100)

server <- function(input, output, session) {

  values <- reactiveValues(idx=1)

  output$plot <- renderPlotly({
    plot_ly(type='scatter', mode='lines') %>%
    add_trace(y=myvec[1])
  })

  plotproxy <- plotlyProxy("plot", session)

  observe({

    plotproxy %>%
      plotlyProxyInvoke("extendTraces",
        list(y=list(list(myvec[values$idx]))),
        list(1))

    if(!values$idx%%10) {
      plotproxy %>% plotlyProxyInvoke("addTraces",
        list(x=c(values$idx, values$idx),  # + 2 would "fix it"
             y=c(0,myvec[values$idx]),
             type="line", showlegend=F))
    }

  })

  observe({
    invalidateLater(1000)
    isolate({
      values$idx <- min(values$idx + 1, length(myvec))
    })
  })

}

shinyApp(ui = ui, server = server)

简而言之,我希望仅使用 extendTraces 更新 x 轴限制,我只是猜测 2 个单位不匹配是问题所在。

最佳答案

我已经设法解决了 x 轴不匹配的问题,但这并没有解决自动调整大小的问题。问题是我没有使用相同的类型和模式。现在可以了:

library(shiny)
library(plotly)

ui <- bootstrapPage(
  plotlyOutput("plot")
)

myvec <- rnorm(100)

server <- function(input, output, session) {

  values <- reactiveValues(idx=1)

  output$plot <- renderPlotly({
    plot_ly(type='scatter', mode='lines') %>%  # Must match with vertical line
    add_trace(x=c(-1,0), y=myvec[1])  # use x values
  })

  plotproxy <- plotlyProxy("plot", session)

  observe({

    plotproxy %>%
      plotlyProxyInvoke("extendTraces",
        list(x=list(list(values$idx)),  # match x values
             y=list(list(myvec[values$idx]))),
        list(1))

    if(!values$idx%%10) {
      plotproxy %>% plotlyProxyInvoke("addTraces",
        list(x=c(values$idx, values$idx),  # x limits match
             y=c(0,myvec[values$idx]),
             type='scatter', mode='lines', showlegend=F))  # must match
    }

  })

  observe({
    invalidateLater(1000)
    isolate({
      values$idx <- min(values$idx + 1, length(myvec))
    })
  })

}

shinyApp(ui = ui, server = server)

关于r - 使用 plotlyProxyInvoke 在不调整绘图大小的情况下向绘图添加垂直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58457439/

相关文章:

java - 使用 eclipse 中的 rJava/JRI 包时,一些命令在 rtest.java 中失败

r - 使用 dbplyr 进行数据库计算

r - 我有一个亚马逊 EC2 实例,并在该实例中创建了一个 Shiny 的应用程序。我需要将域链接到实例 ip

css - 仅在 Shiny 仪表板的特定 tabItem 上应用 css 格式

python - 如何制作一个绘图对象的副本?

R Notebook/Markdown 不使用 "fig.path = " block 选项保存 block 图

渲染带有标题/标题和预选行的 Shiny 数据表

r - Shiny:使 renderUI 对下拉列表使用react,而不是 submitButton

python - Plotly - 如何制作没有盒子的箱线图?

python - Plotly:如何用Python创建子图?