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

ggplot2绘制带抖动条的箱线图:报错排查与分组可视化进阶需求解决

问题解决与进阶可视化方案

先帮你拆解并解决遇到的问题,再给出符合你需求的进阶可视化代码:

错误原因与修复

1. mapping must be created by aes()

你的代码写法不符合ggplot2的核心规范:

  • 不能直接用df + geom_boxplot(...),必须先通过ggplot()初始化绘图对象,统一指定数据源和变量映射
  • aes()内部不能放置data = df,数据源应该在ggplot()函数中声明
  • 避免在aes(y = df$weight_v1_3)里用df$的形式,直接写变量名即可,ggplot会自动从指定的数据源中读取

2. Error in is_reference(x, quote(expr = )) : object 'weight_v1_3' not found

你在scale_color_manual(values = weight_v1_3)里把体重变量名当成了颜色向量,这里需要传入具体的颜色值(比如十六进制颜色码、颜色名称),而不是你的体重变量名。


基础版本:对照组与干预组并排箱线图(带抖动点)

首先先整理你的数据集,把分散的分组变量合并成一个统一的分组列,方便后续绘图:

library(ggplot2)
library(colorspace)
library(dplyr)

# 整理数据集:合并分组变量,统一体重变量名
df_clean <- df %>%
  mutate(
    group = case_when(
      control.0.1. == 1 ~ "Control",
      intervention.0.1. == 1 ~ "Intervention"
    ),
    weight_v1_3 = weight.V1.3  # 统一变量名,和你代码里的命名一致
  )

# 绘制基础版箱线图+抖动点
ggplot(df_clean, aes(x = group, y = weight_v1_3)) +
  # 箱线图:隐藏默认离群点,设置填充和边框样式
  geom_boxplot(
    aes(fill = group, color = group),
    size = 1.5,
    outlier.shape = NA,
    alpha = 0.5
  ) +
  # 抖动点:避免点重叠,设置透明度和大小
  geom_jitter(
    aes(color = group),
    width = 0.1,
    size = 3,
    alpha = 0.5
  ) +
  # 手动设置颜色:这里用两个对比色,你可以自行调整
  scale_color_manual(values = c("Control" = "#2E86AB", "Intervention" = "#F24C4E"), guide = "none") +
  scale_fill_manual(values = c("Control" = lighten("#2E86AB", 0.7), "Intervention" = lighten("#F24C4E", 0.7)), guide = "none") +
  # Y轴刻度设置
  scale_y_continuous(breaks = seq(55, 65, 1)) +
  # 优化标题和标签
  labs(x = "Group", y = "Weight", title = "Weight Distribution: Control vs Intervention") +
  theme_minimal()

进阶版本:3次访视分组展示(每组含对照+干预)

要在同一张图里展示3次访视,每次访视下同时呈现对照组和干预组的箱线图,我们可以利用position_dodge()让同一访视下的两个分组箱线图并排:

ggplot(df_clean, aes(x = factor(visit), y = weight_v1_3)) +
  # 箱线图:按group分颜色,用dodge实现同一访视下的并排效果
  geom_boxplot(
    aes(fill = group, color = group),
    size = 1.2,
    outlier.shape = NA,
    alpha = 0.5,
    position = position_dodge(width = 0.7)
  ) +
  # 抖动点:用相同的dodge参数对齐箱线图
  geom_jitter(
    aes(color = group),
    width = 0.1,
    size = 2.5,
    alpha = 0.5,
    position = position_dodge(width = 0.7)
  ) +
  # 保持颜色一致性
  scale_color_manual(values = c("Control" = "#2E86AB", "Intervention" = "#F24C4E")) +
  scale_fill_manual(values = c("Control" = lighten("#2E86AB", 0.7), "Intervention" = lighten("#F24C4E", 0.7))) +
  scale_y_continuous(breaks = seq(55, 65, 1)) +
  # 把访视数字改成更清晰的标签
  scale_x_discrete(labels = c("Visit 1", "Visit 2", "Visit 3")) +
  labs(x = "Visit", y = "Weight", title = "Weight Distribution Across Visits: Control vs Intervention") +
  theme_minimal() +
  # 优化图例样式
  theme(legend.title = element_blank(), legend.position = "top")

补充说明

  • 你提到的网站里的g应该是他们预先创建的ggplot对象(比如g <- ggplot(data = ..., aes(...))),所以后续可以直接用g + geom_xxx()的链式写法,这是ggplot2的常用语法
  • 如果你的实际数据量很大,抖动点可能会重叠严重,可以用geom_beeswarm()替代geom_jitter(),让点的分布更均匀美观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:52:37