繁体   English   中英

r plotly 带有 plot 行的更新按钮不适用于 add_markers

[英]r plotly update button with line plot does not work with add_markers

我对可更新行的连接 plot 和 R plotly 中的 static 标记有问题。行 plot 通过下拉菜单按钮更新,它本身运行良好。 add_markers function 中的附加点在 plot 首次初始化时也是正确的。

但是在第一次更新之后,标记被切断(到行开始的 plot 的左侧)并修改剩余的标记(y 值与初始值不同)。

对于此处的示例,简化了按钮 function,但结果显示了相同的奇怪行为。

`

sample_df <- tibble::tibble(quarter_date = rep(c("2022-06-30","2022-09-30","2022-12-31"),3),
               forecast_value = runif(9,min = 10,max = 16),
               forecast_date = c(rep("2022-07-23",3),rep("2022-08-26",3),rep("2022-09-15",3)))

marks = tibble::tibble(dates = c("2022-05-21","2022-06-15","2022-07-02","2022-07-26","2022-08-27"),
                       values = c(11,13,12,15,14))

create_buttons <- function(df, date_id) {
  lapply(
    date_id,
    FUN = function(date_id,df) {
      button <- list(
        method = 'restyle',
        args = list('y', list(df %>% 
                                dplyr::filter(forecast_date == date_id) %>% 
                                dplyr::pull(forecast_value))),
        label = sprintf('Forecast @ %s', date_id)
      )
    },
    df
  )
}


plotly::plot_ly(x = ~quarter_date)  %>% 
  plotly::add_trace(data = sample_df %>% 
                      dplyr::filter(forecast_date == max(forecast_date)),
                    #x = ~period_date, 
                    y = ~forecast_value,
                    type = 'scatter',
                    mode = 'markers+lines',
                    name = 'forecasts')  %>%
  plotly::layout(
    title = "Drop down menue",
    yaxis = list(title = "y"),
    updatemenus = list(
      list(
        y =1,
        x = 0.9,
        buttons = create_buttons(sample_df, unique(sample_df$forecast_date))
      )
    )) %>% 
  plotly::add_markers(data = marks,
                      x = ~dates,
                      y = ~values)

`

我试图设置一个宽 xrange,使用第二个 y2 轴和按钮计算中的不同方法,但没有按预期工作。

有谁知道为什么在更新 plot 行后 add_markers 无法正常工作? 任何想法都非常感谢!

添加标记不是问题。 问题来自重新设计。 当您重新设置restyle的样式而没有指定您只想更改一条迹线时,您更改了所有迹线。

解决方案实际上非常简单,您只需要在args调用中多一个参数——列表中的跟踪号:在本例中为list(0) 我已经注释掉了您原来的args调用,因此您可以看到更改。

为了使其可重复,我在创建sample_df之前添加了set.seed(46)

create_buttons <- function(df, date_id) {
  lapply(
    date_id,
    FUN = function(date_id, df) {
      button <- list(
        method = 'restyle',
        args = list('y', list(df %>% filter(forecast_date == date_id) %>% 
                                pull(forecast_value)), list(0)),
        # args = list('y', list(df %>% 
        #                         filter(forecast_date == date_id) %>% 
        #                         pull(forecast_value))),
        label = sprintf('Forecast @ %s', date_id)
      )
    },
    df
  )
}

现在,当您运行 plot 时,您将看到您的标记数据仍然可见。

在此处输入图像描述

在此处输入图像描述

暂无
暂无

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

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