带有 plotly 的分组条形图不起作用

Grouped bar chart with plotly doesn't work

假设this is my dataset:

set.seed(21022022)
TablaStack <- data.frame(
  n <- rbinom(12, 1000, 0.5),
  T1 <- rnorm(12, 300, 50),
  T2 <- rnorm(12, 500, 60),
  T3 <- rnorm(12, 650, 90),
  T4 <- rt(12, 500, 600),
  Variable <- rep(c("A", "B", "C", "D", "E", "F"), 2),
  Group <- c(rep(c("G1"),6),rep(c("G2"),6))
)
colnames(TablaStack) = c("Cases", "T1", "T2", "T3", "T4", "Variable", "Group")
Treatments <- c("Cases", "T1", "T2", "T3", "T4")

我的目的是用下拉菜单 just like this 显示每个处理的变量的两个值(第 1 组和第 2 组)。 这是我的可视化代码,它是 this answer:

的改编版
create_buttons <- function(df, y_axis_var_names) {
  lapply(
    y_axis_var_names,
    FUN = function(var_name, df) {
      button <- list(
        method = 'restyle',
        args = list('y', list(df[, var_name])),
        label = sprintf('%s', var_name)
      )
    },
    df
  )
}


plot_ly(
  TablaStack, 
  x = ~Variable, 
  y = ~Cases,
  color = ~as.factor(Group),
  colors = "Set2",
  type = "bar") %>%
  layout(
    yaxis = list(title = "y"),
    updatemenus = list(
      list(
        y = 0.7,
        buttons = create_buttons(TablaStack, 
                                 Treatments)
      )))

我的问题是当我 select 治疗时 it doesn't show the values for group 2。我不明白为什么会这样。

我确实让它工作了,但是你打电话给 lapply 却没有。有很多人有同样的问题没有得到回答。这真的让我很吃惊。然而,在研究了一段时间之后,我想我明白为什么了。

当您对 plotly 中的元素进行分组时,它不会像 ggplot 那样将分组保存为函数。因此,当您构建绘图时,例如 Cases 实际上是两个子图,而不是一个。您的更新告诉两个子图更新为相同的内容。我试图添加第二个 args 以查看它是否会起作用,但它没有。相反,我将期望添加到 layout.

由于您必须使用您使用的方法取消数据继承,re-group 和 re-subplot,我将其切换为可见性。 (这也更容易排除故障。)

当您查看 true 和 false 的字符串时,将其视为每条轨迹的每一组。例如,前两个是 Cases G1Cases G2.

plot_ly(TablaStack, x = ~Variable, 
        color = ~Group, colors = "Set2") %>%
  add_trace(y = ~Cases, type = "bar", visible = T) %>% 
  add_trace(y = ~T1, type = "bar", visible = F) %>%  # add all traces invisible
  add_trace(y = ~T2, type = "bar", visible = F) %>% 
  add_trace(y = ~T3, type = "bar", visible = F) %>% 
  add_trace(y = ~T4, type = "bar", visible = F) %>% 
  layout(
    yaxis = list(title = "y"),
    updatemenus = list(
      list(
        active = 0,
        y = 0.7,
        buttons = list(
          list(
            method = 'restyle', # update so only Cases is shown
            args = list('visible', list(T, T, F, F, F, F, F, F, F, F)),
            label = "Cases"
          ),
          list(
            method = 'restyle', # update so only T1 is shown
            args = list('visible', list(F, F, T, T, F, F, F, F, F, F)),
            label = "T1"
          ),
          list(
            method = 'restyle', # update so only T2 is shown
            args = list('visible', list(F, F, F, F, T, T, F, F, F, F)),
            label = "T2"
          ),
          list(
            method = 'restyle', # update so only T3 is shown
            args = list('visible', list(F, F, F, F, F, F, T, T, F, F)),
            label = "T3"
          ),
          list(
            method = 'restyle', # update so only T4 is shown
            args = list('visible', list(F, F, F, F, F, F, F, F, T, T)),
            label = "T4"
          )) # end buttons list
      )) # end updatemenus list list
    ) # end layout

我添加了 T2T4 的图像,因此您可以看到它们的输出。