如何在分组图中跨子图对齐分组箱图

问题描述 投票:1回答:1

我正在尝试使用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"会使不同颜色的盒子相互堆叠,甚至更糟!我已经尝试过使用alignmentgroupoffsetgroup进行一些更改,但它们似乎覆盖了boxmode参数,并导致所有内容再次堆叠。我还能做其他什么来生成一个交互式图,以使每个框保持在各自的通道中吗?

有类似的问题here,但我认为这不能解决我的问题。

r plotly boxplot r-plotly
1个回答
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")

给我这个情节:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.