r - 分组箱线图的R plotly下拉事件
问题描述
我想使用 plotly 下拉事件来显示不同的分组箱线图,但是我还没有能够实现这一点:
第一个图显示了带有 dropdown = "4" 的 plotly 的预期输出(使用 ggplot 获得)。第二个情节是我得到的......
library(tidyverse)
library(plotly)
dat <- mtcars %>%
filter(cyl == 4 | carb == 4) %>%
group_by(cyl, carb, am) %>%
summarise(boxplot= list( setNames(boxplot.stats(disp)$stats,
c('lower_whisker','lower_hinge','median','upper_hinge','upper_whisker')) )) %>%
unnest_wider(boxplot) %>%
arrange(cyl, carb, am) %>%
ungroup() %>%
mutate_at(vars(cyl, carb, am), as.character)
cylinders <- unique(dat$cyl)
dat %>%
filter(cyl == 4) %>%
ggplot(aes(
x = carb,
lower = lower_hinge,
upper = upper_hinge,
middle = median,
ymin = lower_whisker,
ymax = upper_whisker,
colour = am)) +
geom_boxplot(stat = "identity")
p <- plot_ly(type = "box")
for(icyl in cylinders){
dataFilt <- filter(dat, cyl == icyl)
p <- add_trace(p,
visible = TRUE,
q1 = dataFilt$lower_hinge,
median = dataFilt$median,
q3 = dataFilt$upper_hinge,
lowerfence = dataFilt$lower_whisker,
upperfence = dataFilt$upper_whisker,
x = dataFilt$carb,
color = dataFilt$am,
name=icyl
)
}
p %>%
layout(boxmode = "group",
updatemenus = list(
list(
y = 0.8,
buttons = list(
list(label = cylinders[1],
method = "update",
args = list(list(visible = c(TRUE, FALSE, FALSE)))),
list(label = cylinders[2],
method = "update",
args = list(list(visible = c(FALSE, TRUE, FALSE)))),
list(label = cylinders[3],
method = "update",
args = list(list(visible = c(FALSE, FALSE, TRUE))))
))))
解决方案
我无法让它与循环一起工作,但我确实让它像你预期的那样工作。我没有使用您完成所有手动工作来创建铰链、胡须等的变体,而是使用add_boxplot
.
layout
你会看到有 6 个 T 或 F。那是因为没有plotly
将分组保存为函数,而是将数据转换为两个单独的跟踪。例如,前两个是cyl == "4" & am == "0"
和cyl == "4" & am == "1"
cylinders <- unique(mtcars$cyl) # kept similar from original work
# added to simplify build
mtcars <- mtcars %>% mutate_at(vars(cyl, carb, am), as.character)
# made all cylinder options subplots
plot_ly() %>%
add_boxplot(x = ~carb, y = ~disp, color = ~am, colors = "Set2",
data = mtcars[mtcars$cyl == cylinders[1], ],
visible = T, inherit = F) %>% # visible
add_boxplot(x = ~carb, y = ~disp, color = ~am, colors = "Set2",
data = mtcars[mtcars$cyl == cylinders[2], ],
visible = F, inherit = F) %>% # invisible
add_boxplot(x = ~carb, y = ~disp, color = ~am, colors = "Set2",
data = mtcars[mtcars$cyl == cylinders[3], ],
visible = F, inherit = F) %>% # invisible
layout(updatemenus = list(
list(
y = 0.8,
buttons = list(
list(label = cylinders[1], # four cyl
method = "restyle",
args = list("visible", list(T, T, F, F, F, F))),
list(label = cylinders[2], # six cyl
method = "restyle",
args = list("visible", list(F, F, T, T, F, F))),
list(label = cylinders[3], # eight cyl
method = "restyle",
args = list("visible", list(F, F, F, F, T, T)))
) # end buttons
)) # end updatedmenus list list
) # end layout
这是 4 缸plotly
和你原来的 4 缸ggplot
推荐阅读
- javascript - 使用 Next.JS 的 React-Select V2.0
- r - Rshiny 中的动态输入
- jenkins-pipeline - Jenkins Pipline - 遍历节点数组
- javascript - 将带有指定标志图标的网站书签添加到手机主屏幕
- sql - SQL:多个日期的累积行数,包括日期
- xml - 如何从选定 ComboBox 项上的 XML 文件中正确填充文本框?
- java - Android Studio 语法错误
- codeigniter - codeigniter 中的动态数据加载
- javascript - 根据查询更新 Cloud Firestore 中的文档
- php - 运行一个 php 文件