r - 绘制多个更新菜单

标签 r plotly r-plotly ggplotly

构建于 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

这是输出,它根本不起作用: enter image description here


编辑
例如,如果选择 FB,我希望仅显示一个数据点,即 (5, 5)

最佳答案

当您创建此 plotly 对象时,plotly 将其分为五个迹线。因此,当您想要使用可见性时,您需要解决这些跟踪中的每一个。如果您有任何疑问,请告诉我!

我使用gg1找到了五个痕迹以及每个痕迹中的内容。您可以在源 Pane 中查看gg1plotly_json()

通常(并非总是!),您会在 gg1$x$data 处找到跟踪,其中 gg1plotly 对象。

有五个痕迹。对于每个 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/

相关文章:

r - ggplot2 中 geom_line 层的正确参数

python - 带有基于另一列的标记的 Pandas 线图

python - 如何使用 bool 开关更新 Dash 中的图形?

r - Plotly 分类热图中的对角线注释

r - 如何使用管道工在网络上显示/发送 r plotly plots?

r - 使用 ggplot 更改点的形状和颜色

r - 如何拟合具有给定半径的圆来采样数据点

regex - 将数据框元素转换为R中的字符串

python - 在 plotly 中使用 x 范围 slider 进行 Y 轴自动缩放

r - 修改通过 ggplotly 创建的绘图的工具提示信息