如何无需新增数据列,按条件将观测值分两组绘制geom_violin?
当然可以不用新增分组列!
你的思路没问题,但原代码的x映射写法不符合ggplot的语法要求,我们可以直接在aes()里通过条件判断生成临时分组,完全不用修改原数据集。
方法一:用ifelse直接生成分组标签
这是最简洁的方式,直接在x的映射里对每个va_AC值做判断,返回对应的分组名称:
library(ggplot2) ggplot(df) + geom_violin(aes(x = ifelse(va_AC == 1, "va_AC = 1", "va_AC > 1"), y = g_AD)) + labs(x = "分组", y = "g_AD") # 给坐标轴添加清晰的标题
方法二:用factor控制分组顺序(可选)
如果需要指定分组在图上的显示顺序,或者担心数据里存在va_AC < 1的异常值,可以用factor()来明确分组的水平:
ggplot(df) + geom_violin(aes( x = factor( ifelse(va_AC == 1, "Group 1", "Group 2"), levels = c("Group 1", "Group 2") # 指定分组显示顺序 ), y = g_AD )) + labs( x = "分组", y = "g_AD", subtitle = "Group 1: va_AC = 1; Group 2: va_AC > 1" )
为什么你的原代码会出错?
你写的x=[va_AC == 1] or [va_AC > 1]存在两个问题:
- 在R里逻辑或的运算符是
|,不是or; - 这种写法会生成一个逻辑向量,而ggplot需要的是用于分组的类别型变量(比如字符串或因子),不是逻辑判断结果。
用上面的方法就能直接在映射里生成临时分组,完美避开修改原数据集的操作~
内容的提问来源于stack exchange,提问作者Carmen Sandoval
相关产品推荐
相关产品推荐

