使用 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 是另一种方法。但是,如果数据保持不变,我想切换可见性的计算强度会降低。
我正在尝试更新通过 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