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

Posted

技术标签:

【中文标题】如何在plotly中跨子图对齐分组箱线图【英文标题】:How to align grouped boxplot across subplots in plotly 【发布时间】:2020-09-03 05:11:08 【问题描述】:

我正在尝试使用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 也有类似的问题,但我认为这不能解决我的问题。

【问题讨论】:

【参考方案1】:

习惯了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")

给我这个情节:

【讨论】:

我有一个问题。我曾经也使用layout(boxmode = "group")。今天,我运行了我的旧代码,发现layout() 不再使用boxmode。您的代码和我的代码仍在运行并出现警告。我想知道您是否知道有关此更新的任何更新。如果没有,boxmode,我们可以使用什么? 嗨爵士乐。据我所知,警告只是警告。当我运行代码时,我收到有关 dplyr 兼容性问题的警告。据我所知,这个问题已在 plotly 的开发版本中修复,并且可能应该在下一个版本中修复。与 boxmode 相关的第二个警告也没有问题。据我所知,这与 plotly 包不是最新的 plotly.js 的事实有关,即 plotly 包不知道这个选项,但 plotly.js 知道。这就是代码有效的原因。最佳 S. 感谢您的信息!我只会等待下一次更新。干杯。

以上是关于如何在plotly中跨子图对齐分组箱线图的主要内容,如果未能解决你的问题,请参考以下文章

在 matplotlib 中跨子图绘制分界线

如何在 react.js 中跨子组件持久化数据或状态?

Plotly - 如何制作没有盒子的箱线图?

Python 中的 Plotly 是什么?

Python 中的 Plotly 是什么?

在 Android 中跨子模块使用强制通用 buildToolsVersion 有啥影响?