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

在R中绘制指定因子组合的半小提琴图(按测试与年级分组)

解决方案:按测试阶段展示指定年级的半小提琴图

核心思路是筛选对应测试阶段的目标年级数据,通过geom_violinhalf的方向控制参数,结合位置调整,实现无需拼接的优雅绘图效果。

1. 数据预处理(明确筛选目标数据)

先过滤出每个测试阶段需要保留的年级数据,避免多余数据干扰:

set.seed(1)
data <- data.frame(
  group = rep(sample(c('Treatment', 'Control'), 50, TRUE), each = 2),
  test_id = rep(c('pre', 'post'), 50),
  grade = sample(3:6, 100, replace = TRUE),
  Score = runif(100)
)

# 筛选pre对应5、6年级,post对应3、4年级
filtered_data <- data %>%
  dplyr::filter(
    (test_id == "pre" & grade %in% c(5,6)) |
    (test_id == "post" & grade %in% c(3,4))
  )

2. 绘制符合需求的半小提琴图

利用flip参数控制半小提琴的朝向,配合位置偏移让同阶段的不同年级图形错开:

library(ggplot2)
library(see)
library(dplyr)

ggplot(filtered_data, aes(x = test_id, y = Score, fill = factor(grade))) +
  # 箱线图:调整宽度和位置避免重叠
  geom_boxplot(width = 0.1, position = position_dodge(width = 0.2)) +
  # 半小提琴图:pre侧朝左,post侧朝右
  geom_violinhalf(
    aes(group = interaction(test_id, grade)),
    trim = FALSE,
    flip = ifelse(filtered_data$test_id == "pre", FALSE, TRUE),
    position = position_dodge(width = 0.2)
  ) +
  # 设置填充色区分年级
  scale_fill_brewer(palette = "Set2") +
  theme_classic(16) +
  labs(x = "测试阶段", y = "分数", fill = "年级")

关键细节说明

  • 数据过滤:确保每个测试阶段仅包含目标年级,避免无效数据出现在图中
  • 方向控制:通过flip参数让pre阶段的半小提琴朝左(展示在x轴标签左侧),post阶段朝右(展示在x轴标签右侧)
  • 位置偏移:position_dodge让同测试阶段的不同年级图形横向错开,解决重叠问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:17:45