构建于 this发布后,我尝试在 R plotly
中创建两个 updatemenus
,这将允许选择两个因素的每种可能的组合。
这是我到目前为止所做的:
library(plotly)
X <- data.frame(x = 1:6,
y = 1:6,
z = 1:6,
gender = rep(c("M", "F"), each = 3),
eyes = rep(c("B", "G"), 3))
gg <- ggplot(data = X, aes(x = x, y = y)) +
geom_point(aes(color = z, alpha = interaction(gender, eyes))) +
scale_alpha_manual(values = rep(1, 4))
ggplotly(gg) %>%
layout(
updatemenus = list(
list(y = 1,
buttons = list(
list(method = "restyle",
args = list(list(visible = c(TRUE, TRUE, TRUE, TRUE)), 0:3),
label = "F&M"),
list(method = "restyle",
args = list(list(visible = c(TRUE, TRUE)), c(0, 2)),
label = "F"),
list(method = "restyle",
args = list(list(visible = c(TRUE, TRUE)), c(1, 3)),
label = "M"))),
list(y = .8,
buttons = list(
list(method = "restyle",
args = list(list(visible = c(TRUE, TRUE, TRUE, TRUE)), 0:3),
label = "B&G"),
list(method = "restyle",
args = list(list(visible = c(TRUE, TRUE)), 0:1),
label = "B"),
list(method = "restyle",
args = list(list(visible = c(TRUE, TRUE)), 2:3),
label = "G")))
)
)
)
数据:
# x y z gender eyes
# 1 1 1 M B
# 2 2 2 M G
# 3 3 3 M B
# 4 4 4 F G
# 5 5 5 F B
# 6 6 6 F G
编辑
例如,如果选择 F
和 B
,我希望仅显示一个数据点,即 (5, 5)
。
最佳答案
当您创建此 plotly
对象时,plotly
将其分为五个迹线。因此,当您想要使用可见性时,您需要解决这些跟踪中的每一个。如果您有任何疑问,请告诉我!
我使用gg1
找到了五个痕迹以及每个痕迹中的内容。您可以在源 Pane 中查看gg1
或plotly_json()
。
通常(并非总是!),您会在 gg1$x$data
处找到跟踪,其中 gg1
是 plotly
对象。
有五个痕迹。对于每个 args
,每个跟踪都需要 T 或 F 来实现可见性。
- 第一条迹线仅包含 (5, 5),即 F B
- 第二条轨迹包含 (1, 1) 和 (3, 3);这些都是MB
- 第三条迹线包含 (4, 4) 和 (6, 6);那些都是F G
- 第四条轨迹包含 (2, 2);那是 MG
- 第五条迹线包含所有迹线使用的颜色渐变
代码如下:
gg1 = plotly_build(gg)
ggplotly(gg) %>%
layout(
updatemenus = list(
list(y = 1,
buttons = list(
list(method = "restyle",
args = list("visible", as.list(unlist(rep(T, 5)))),
label = "F&M"),
list(method = "restyle",
args = list("visible", list(T, F, T, F, T)),
label = "F"),
list(method = "restyle",
args = list("visible", list(F, T, F, T, T)),
label = "M")
) # end button
), # end first button list
list(y = .8,
buttons = list(
list(method = "restyle",
args = list("visible", as.list(unlist(rep(T, 5)))),
label = "B&G"),
list(method = "restyle",
args = list("visible", list(T, T, F, F, T)),
label = "B"),
list(method = "restyle",
args = list("visible", list(F, F, T, T, T)),
label = "G")
) # end button
) # end second menu list
) # end updatemenus
) # end layout
更新
根据我们的评论,我认为目前不可能使用相互交互的 updatemenus
样式按钮。
关于r - 绘制多个更新菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71807698/