stat_summary可以像geom_boxplot那样在x轴上按颜色分隔组吗?

yr9zkbsy  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(85)

我在R中使用ggplot2来可视化一些不同因素的相互作用。到目前为止,这完全符合我的要求:

ggplot(dta_trim, aes(x=Treatment, y=Result, fill=Gender)) +
  geom_boxplot()

字符串
换句话说,它首先按治疗将x轴上的数据划分,然后按性别划分,并在y轴上显示结果。
但是,如果我使用geom_boxplot以外的任何几何体,它不再被性别整除。例如:

... +
  geom_point(position=position_jitter(width = .1), alpha=.15, size=2) +
  stat_summary(fun=mean, geom="point") +
  stat_summary(fun.data=mean_cl_boot, geom="errorbar", width=0.3)


的数据
更具体地说,它似乎确实按性别划分了数据,但并没有在x轴上将它们分开(你可以看到男性和女性组的平均值分开绘制,但一个在另一个的正上方)。
我怎样才能让这些其他的几何体在x轴上按性别分开,就像geom_boxplot一样?我以为把位置函数设置为position_dodge就可以了,但它并没有像我希望的那样分开它们。

iq0todco

iq0todco1#

与默认使用position_dodgegeom_boxplot相反,geom_pointgeom_errorbar使用position="identity"。因此,如果你想避开其他层,你必须告诉ggplo2这样做,为这些层设置position = position_dodge(width = .75),除了你必须使用position_jitterdodge的抖动点。
使用一些基于mtcars的假示例数据:

library(ggplot2)

dta_trim <- mtcars |>
  dplyr::select(
    Treatment = cyl,
    Result = mpg,
    Gender = am
  ) |>
  dplyr::mutate(Treatment = factor(Treatment), Gender = factor(Gender))

ggplot(dta_trim, aes(x = Treatment, y = Result, fill = Gender)) +
  geom_boxplot() +
  geom_point(
    position = position_jitterdodge(
      dodge.width = 0.75, jitter.width = .1
    ),
    alpha = .15, size = 2
  ) +
  stat_summary(
    fun = mean, geom = "point",
    position = position_dodge(width = .75)
  ) +
  stat_summary(
    fun.data = mean_cl_boot, geom = "errorbar", width = 0.3,
    position = position_dodge(width = .75)
  )

字符串


的数据

qq24tv8q

qq24tv8q2#

https://psyteachr.github.io/introdataviz/representing-summary-statistics.html#grouped-violin-boxplots
如果你看一下上面的链接,你会看到他们是如何做到的。本质上,你需要为每个元素指定position = position_dodge(width = 0.6)或任何你选择的宽度(boxplot,geom_point,stat_summary)。这将确保每个元素正确对齐。对于geom_point(position = position_jitter(...)),你可以用position_jitterdodge(...)替换它。

相关问题