首页 > 解决方案 > 仅使用 plotly::ggplotly 兼容的几何图形将箱形图放置在多面图的边缘

问题描述

我正在制作一个函数,通过 ggplotly 函数为任何给定的数据集创建一个 plotly雨云图。其中大部分非常简单,但箱线图覆盖不起作用。

我目前最好的尝试是这样的:

raincloud <- ggplot2::ggplot(data = iris) +
  ggplot2::geom_density(mapping = ggplot2::aes(x = Sepal.Length,
                                               fill = Species,
                                               colour = NA),
                        alpha = .85) + 
  ggplot2::geom_rug(mapping = ggplot2::aes(x = Sepal.Length, 
                                       colour = Species),
                size = 1, 
                alpha = .6) +
  ggplot2::geom_boxplot(mapping = ggplot2::aes(x = Sepal.Length,
                                               y = -.1,
                                               fill = Species,
                                               colour = Species),
                        width = 0.2,
                        alpha = .3) +
  ggplot2::facet_grid(rows = 'Species') +
  ggplot2::theme_minimal()


raincloud

plotly::ggplotly(raincloud)

这种方法有两个主要问题:

  1. 箱线图被人为地放置在绘图区域内,而不是边缘。而且因为我将它设置为 fixedy和 fixed width,它可以与密度重叠或在其下方看起来很小,具体取决于分布的高度。这就是为什么我得出结论,我需要把它放在地块边缘,在 geom_rug 上。

static_ggplot

  1. 生成ggplotly时,箱形图就消失了,只留下一条虚线,就好像它是另一个geom_rug一样。我知道 plotly 有 boxplot 支持,但也许水平 + faceted 的组合对于它的翻译来说太过分了。

在此处输入图像描述

我坚持强调需要它与情节兼容,因此来自的自定义几何图形等不是一种选择,因为 ggplotly 的翻译器不支持它们ggdistggExtra

标签: rggplot2r-plotlyggplotly

解决方案


我现在在我的包编年史中完全实现了这一点。我必须使用geom_segment()和手动绘制箱线图的所有线条和矩形geom_rect()

library(chronicle)

make_raincloud(dt = iris,
         value = 'Sepal.Length',
         groups = 'Species')

推荐阅读