You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Sina图展示多因素设计数据?含双/四因素场景

嘿,我完全懂你现在的着急——论文马上要投稿,却卡在了Sina图的分组展示上,不管是最初的双因素还是后来扩展的四因素设计,都没法像小提琴图那样完美分组。别担心,我给你两个针对性的解决方案,亲测有效:

原问题:双因素设计的分组Sina图解决方案

首先看你的双因素示例数据:

DF <- data.frame(dv = rnorm(900), iv.x = sort(rep(letters[1:3], 300)), iv.y = rep(sort(rep(rev(letters)[1:3], 100)), 3))

目前geom_sina确实不支持position_dodge,但我们可以手动给每个分组的x轴位置加偏移量,模拟分组效果:

library(ggplot2)
library(ggforce)

# 将分类变量iv.x转为数值型,方便添加偏移
DF$x_num <- as.numeric(DF$iv.x)
# 给iv.y的每个水平分配专属偏移量(组数不同可调整数值)
offset <- c(-0.2, 0, 0.2)
names(offset) <- unique(DF$iv.y)
DF$x_offset <- DF$x_num + offset[DF$iv.y]

# 绘制分组Sina图
ggplot(DF, aes(x_offset, dv, colour = iv.y)) +
  geom_sina(alpha = 0.6) + # 调整透明度避免点重叠过密
  # 把x轴刻度改回原始分类标签
  scale_x_continuous(breaks = 1:3, labels = letters[1:3]) +
  labs(x = "iv.x") +
  theme_bw()

这样就能实现和小提琴图一致的分组展示,每个iv.x下的不同iv.y组会整齐分开。

编辑:四因素设计结合facet_grid的解决方案

针对你扩展的四因素数据:

DF <- data.frame(dv=rnorm(400), iv.w=sort(rep(letters[1:2],200)), iv.x=rep(sort(rep(letters[3:4],100)), 2), iv.y=rep(sort(rep(rev(letters)[1:2],50)),4), iv.z=rep(sort(rep(letters[5:6],25)),8))

我们同样用手动偏移的思路,同时配合facet_grid,还要加上你需要的均值点和误差线:

library(ggplot2)
library(ggforce)
library(Hmisc) # 若未安装先运行:install.packages("Hmisc")

# 处理x轴偏移
DF$x_num <- as.numeric(DF$iv.x)
# iv.y有2个水平,设置对称偏移量
offset <- c(-0.15, 0.15)
names(offset) <- unique(DF$iv.y)
DF$x_offset <- DF$x_num + offset[DF$iv.y]

# 绘制带分面的分组Sina图
ggplot(DF, aes(x_offset, dv, colour = iv.y, fill = iv.y)) +
  geom_sina(alpha = 0.6) +
  # 添加均值点(基于偏移后的位置)
  stat_summary(aes(y = dv), fun = mean, geom = "point", colour = "black", 
               show.legend = FALSE, size = 2) +
  # 添加误差线(基于原始x位置,用position_dodge对齐)
  stat_summary(aes(x = x_num, y = dv), fun.data = mean_cl_normal, geom = "errorbar", 
               position = position_dodge(width = 0.3), width = 0.2, 
               show.legend = FALSE, colour = "black", size = 0.8) +
  # 分面设置
  facet_grid(iv.w ~ iv.z) +
  # 还原x轴分类标签
  scale_x_continuous(breaks = 1:2, labels = letters[3:4]) +
  labs(x = "iv.x") +
  theme_bw()

这里的小技巧是:误差线用原始的x_num位置配合position_dodge,这样误差线会正好落在两个Sina组的中间,和你给出的小提琴图效果完全匹配。你可以根据图的大小调整偏移量(比如把0.15改成0.2),让分组间距更美观。

另外提一句:如果后续ggforce更新支持了position_dodge,直接用geom_sina(position = position_dodge(width = 0.5))就可以,但目前这个手动偏移的方法是最稳定的临时方案,完全能满足投稿的图件要求。

内容的提问来源于stack exchange,提问作者Tiberius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:32:02