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

如何调整ggplot小提琴图,使四类刺激-响应组合横向并排展示?

解决方案

要实现四类条件(成人皱眉、成人微笑、儿童皱眉、儿童微笑)的小提琴图横向并排,核心是将stimulus age和response type两个变量合并为一个组合分类变量,以此作为x轴的映射项。以下是具体修改步骤和代码:

1. 生成组合分类变量

先在数据框中合并两个分组变量,生成唯一的条件标签:

library(dplyr)
library(ggplot2)

# 假设你的数据框名为df,包含stimulus_age、response_type、congruence_effect列
df <- df %>%
  # 合并两个变量为新列condition,分隔符用空格
  unite(condition, stimulus_age, response_type, sep = " ", remove = FALSE)

如果需要自定义中文标签(比如把"Adult Frown"改为"成人皱眉"),可以将新列转为有序因子:

df$condition <- factor(df$condition,
                       levels = c("Adult Frown", "Adult Smile", "Child Frown", "Child Smile"),
                       labels = c("成人皱眉", "成人微笑", "儿童皱眉", "儿童微笑"))

2. 绘制横向并排的小提琴图

以新生成的condition作为x轴,直接绘制小提琴图:

ggplot(df, aes(x = condition, y = congruence_effect)) +
  geom_violin(fill = "#4292c6", alpha = 0.7) +
  # 可选:添加散点展示原始数据分布
  geom_jitter(width = 0.2, size = 1, alpha = 0.4, color = "#2171b5") +
  labs(
    x = "实验条件",
    y = "一致性效应(Incongruent - Congruent)",
    title = "不同刺激年龄与反应类型下的一致性效应分布"
  ) +
  theme_bw() +
  theme(
    axis.text.x = element_text(size = 10, hjust = 0.5),
    plot.title = element_text(hjust = 0.5)
  )

3. 无需新增列的简化写法

如果不想修改数据框,可直接在aes中用interaction()函数动态合并变量:

ggplot(df, aes(x = interaction(stimulus_age, response_type, sep = " "), y = congruence_effect)) +
  geom_violin(fill = "#4292c6", alpha = 0.7) +
  labs(x = "实验条件", y = "一致性效应(Incongruent - Congruent)") +
  theme_bw()

原代码可能的问题点

如果你的原图表不符合预期,大概率是以下原因:

  • 仅将其中一个变量作为x轴,另一个用fill映射,导致同一x位置出现重叠的小提琴组;
  • 使用了facet_wrap/facet_grid拆分两个变量,生成了多行多列的子图而非横向并排的单组图;
  • 未指定组合变量的顺序,导致四类条件排列混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:55:20