带有 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 G1
和 Cases 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
我添加了 T2
和 T4
的图像,因此您可以看到它们的输出。
假设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 G1
和 Cases 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
我添加了 T2
和 T4
的图像,因此您可以看到它们的输出。