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

如何在ggplot中单独调整单个条件的半小提琴图方向?

解决方案:独立控制半小提琴图方向 + 修复雨云图mutate错误

一、用ggdist实现单侧独立翻转的半小提琴图

核心思路是给stat_halfeye的side参数按实验条件映射不同值,而非全局设置统一方向,这样就能让Baseline和TUS的半小提琴分别朝向数据点外侧。

假设你的数据框名为df,列名分别为subject(被试编号)、condition(实验条件)、mep(MEP测量值),代码示例:

library(ggplot2)
library(ggdist)

# 确保条件列是因子(可选,用于固定x轴顺序)
df$condition <- factor(df$condition, levels = c("Baseline", "TUS"))

ggplot(df, aes(x = condition, y = mep)) +
  # 按条件分配半小提琴方向:Baseline朝左,TUS朝右
  stat_halfeye(
    aes(side = case_when(
      condition == "Baseline" ~ "left",
      condition == "TUS" ~ "right"
    )),
    adjust = 1, width = 0.6, fill = "gray80"
  ) +
  # 绘制单个数据点
  geom_point(size = 2, color = "black") +
  theme_classic()

说明:case_when会为每一行数据匹配对应的side值,实现两个条件的半小提琴方向独立控制,不会出现同时翻转或报错的问题。

二、修复雨云图的mutate错误

报错side必须为长度56或1,而非2的原因是:你给side赋值的是长度为2的向量(对应两个条件),但数据框有56行,需要为每一行数据单独分配side值。

代码示例(先处理数据再绘图):

library(dplyr)
library(ggplot2)

# 为每一行数据添加对应的side列(长度56,匹配数据行数)
df <- df %>%
  mutate(side = case_when(
    condition == "Baseline" ~ "left",
    condition == "TUS" ~ "right"
  ))

# 绘制雨云图(半小提琴+散点)
ggplot(df, aes(x = condition, y = mep)) +
  geom_violin(aes(side = side), scale = "width", width = 0.6, fill = "gray80") +
  geom_point(size = 2, color = "black") +
  theme_classic()

说明:通过mutate结合case_when,为每个被试的行数据都设置了对应的side值,长度与数据框行数一致,即可解决长度不匹配的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:10:35