【问题标题】:Adding a vertical line to plotly plot using plotlyProxyInvoke without resizing the plot使用 plotlyProxyInvoke 添加一条垂直线以绘图而不调整绘图大小
【发布时间】:2019-10-18 20:00:36
【问题描述】:

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

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

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

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)

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

【问题讨论】:

    标签: r shiny plotly


    【解决方案1】:

    我已经设法解决了 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)
    

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多