在 geom_boxplot 上覆盖 geom_point(aes(shape))?

Posted

技术标签:

【中文标题】在 geom_boxplot 上覆盖 geom_point(aes(shape))?【英文标题】:Overlay geom_points(aes(shape)) on geom_boxplot? 【发布时间】:2022-01-12 05:02:10 【问题描述】:

我只是想绘制一个ggplot 在箱线图上覆盖点图的图。我得到了非常奇怪的结果,希望有人能告诉我为什么以及如何解决它。 Overlay geom_points() on geom_boxplot(fill=group)? 这是一个类似的问题。但我的关键问题是shape

这里有一个例子:

library(ggplot2)
library(dplyr)

head(mtcars)

data = data.frame(
  x = factor(mtcars$vs),
  y = mtcars$wt,
  fill = factor(mtcars$am)
) %>% 
  dplyr::arrange(x, fill) %>% 
  dplyr::mutate(shape = rep(letters[1:4], 8))

set.seed(1)
ggplot(data, aes(x, y, fill = fill)) +
  geom_boxplot() +
  geom_point(position=position_jitterdodge())

我可以得到一个情节:

然后我添加形状映射。您可以看到所有点都完全改变了。我想要的是与上面相同的情节,只是点的形状发生了变化。即,点的位置不应改变。不知道为什么添加形状映射后,点不正确地分配给框组。

set.seed(1)
ggplot(data, aes(x, y, fill = fill)) +
  geom_boxplot() +
  geom_point(aes(shape = shape), position=position_jitterdodge())

【问题讨论】:

geom_point(aes(shape = shape, group = fill), position=position_jitterdodge()) 的结果是否如您所愿? @JonSpring 是的!您能否发布一个答案,以便我接受作为解决方案? 【参考方案1】:

在这种情况下,我们希望位置抖动能够“感知”两个填充值,这两个填充值与fill 美学不同。由于此处的形状没有fill 美感,因此该图层不会在应用抖动之前自动分离两个填充值。为了让图层“感知”填充值,我们可以使用

geom_point(aes(shape = shape, group = fill), 
               position=position_jitterdodge()) 

group = fill 告诉图层根据该变量对点进行分组,然后将反映在点抖动的方式中。

【讨论】:

以上是关于在 geom_boxplot 上覆盖 geom_point(aes(shape))?的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2 函数中 geom_boxplot 的平均值和中值箱线图图例

更改 geom_boxplot 中的晶须定义

geom_boxplot 中不显示垂直线

ggplot geom_boxplot 用于基因表达数据

geom_boxplot 作为直方图中的插图

是否可以使用单个“geom_boxplot()”来对不带分面的分组部分箱线图进行ggplot?