我正在尝试使用plotly
对箱形图进行子图绘制,以使相同颜色的框在x轴上彼此对齐。但是,当我使用boxmode = group
分开它们时:
library(plotly)
library(tidyverse)
df <- data.frame(
w = rep(1:3, times = 2, each = 60),
x = rep(c("A", "B", "C"), times = 20),
y = rep(c("D", "E", "F"), each = 20),
z = rnorm(120)
)
p <- function(val) {
filter(df, w == val) %>%
plot_ly(x = ~x, y = ~z, color = ~y, type = "box") %>%
layout(boxmode = "group")
}
subplot(lapply(unique(df$w), p), nrows = 3, shareX = TRUE)
使用ggplot
时不会发生这种情况:
(ggp <- ggplot(df, aes(x = x, y = z, color = y)) +
geom_boxplot() +
facet_wrap(. ~ w, nrow = 3))
但是如果我尝试将此图传递给ggplotly()
,则会再次发生:
ggplotly(ggp) %>%
layout(boxmode = "group")
移除boxmode = "group"
会使不同颜色的盒子相互堆叠,甚至更糟!我尝试使用alignmentgroup
和offsetgroup
进行一些更改,但它们似乎覆盖了boxmode
参数,并导致所有内容再次堆叠。我还能做些其他什么来生成一个交互式图,以使每个框保持在各自的通道内?
here也有类似的问题,但我认为这不能解决我的问题。
答案 0 :(得分:0)
习惯了ggplot2
的感觉很尴尬,但是确实有效。技巧是将单个组的箱线图添加为单独的迹线,并设置offsetgroup
。试试这个:
library(plotly)
library(tidyverse)
df <- data.frame(
w = rep(1:3, times = 2, each = 60),
x = rep(c("A", "B", "C"), times = 20),
y = rep(c("D", "E", "F"), each = 20),
z = rnorm(120)
)
p <- function(val) {
df <- filter(df, w == val)
# 1. Step by step
# plot_ly(x = ~x, y = ~z, color = ~y) %>%
# #purrr::reduce(unique(df$y), ~ add_trace(.y, data = filter(df, y == .x), type = "box", offsetgroup = .x))
# add_trace(data = filter(df, y == "D"), type = "box", offsetgroup = "D") %>%
# add_trace(data = filter(df, y == "E"), type = "box", offsetgroup = "E") %>%
# add_trace(data = filter(df, y == "F"), type = "box", offsetgroup = "F")
# 2. using purrr::reduce
purrr::reduce(unique(df$y), function(.x, .y) {
add_trace(.x, data = filter(df, y == .y), type = "box",
offsetgroup = .y)
}, .init = plot_ly(x = ~x, y = ~z, color = ~y))
}
subplot(lapply(unique(df$w), p), nrows = 3, shareX = TRUE) %>%
layout(boxmode = "group")
给我这个情节: