使用 plotly 更新多个数据属性

Updating multiple data attributes with plotly

我正在尝试更新通过 plotly 生成的图形中的多个数据属性。

这是我基于此 post:

编写的脚本
library(plotly)
library(magrittr)
library(data.table)

X <- data.table(x = c(1, 2, 1, 2), y = c(1, 1, 2, 2), z = rep(c("a", "b"), each = 2))

gg <- ggplot() + geom_point(data = X, aes(x = x, y = y, color = z))

ggplotly(gg) %>% 
  layout(
    updatemenus = list(
      list(
        buttons = list(
          list(method = "restyle",
               args = list(
                 list(x = list(X[z == "a", x])),
                 list(y = list(X[z == "a", y]))
               ),
               label = "a"),
          list(method = "restyle",
               args = list(
                 list(x = list(X[z == "b", x])),
                 list(y = list(X[z == "b", y]))
               ),
               label = "b")
        )
      )
    )
  )

但是,可以看出,更新菜单没有按预期工作。不确定是什么问题。

您上面的 args 参数中的列表太多。

此外,当调用 restyle 时未指定跟踪号,您将重新设置所有跟踪的样式。

如果你想restyle一个单独的跟踪你需要提供它的跟踪索引:

library(plotly)
library(magrittr)
library(data.table)

DT <- data.table(x = c(1, 2, 10, 20), y = c(1, 1, 20, 20), z = rep(c("a", "b"), each = 2))

gg <- ggplot() + geom_point(data = DT, aes(x = x, y = y, color = z))

ggplotly(gg) %>% 
  layout(
    updatemenus = list(
      list(
        buttons = list(
          list(method = "restyle",
               args = list(list(x = DT[z == "a", x], y = DT[z == "a", y]), 0L),
               label = "a"),
          list(method = "restyle",
               args = list(list(x = DT[z == "b", x], y = DT[z == "b", y]), 1L),
               label = "b")
        )
      )
    )
  )

我不确定你想要达到什么目的。

如果您想在选择“a”时显示迹线“a”并在选择“b”时显示迹线“b”,则这种过滤方法是有问题的,因为它从图中完全删除了迹线(减少了数据集)删除痕迹后,您将无法再重新设置样式。

如果您只想切换跟踪可见性,您应该使用 visible 参数而不是修改数据:

DT <- data.table(x = c(1, 2, 10, 20), y = c(1, 1, 20, 20), z = rep(c("a", "b"), each = 2))

gg <- ggplot() + geom_point(data = DT, aes(x = x, y = y, color = z))

ggplotly(gg) %>% style(visible = FALSE, traces = 2) %>% 
  layout(
    updatemenus = list(
      list(
        buttons = list(
          list(method = "restyle",
               args = list(list(visible = c(TRUE, FALSE)), c(0, 1)),
               label = "a"),
          list(method = "restyle",
               args = list(list(visible = c(FALSE, TRUE)), c(0, 1)),
               label = "b")
        )
      )
    )
  )

PS:Plotly.restyle 期望跟踪计数从 0 (JS) 开始,style() 从 1 (R)

使用addTraces/deleteTraces as done 是另一种方法。但是,如果数据保持不变,我想切换可见性的计算强度会降低。