ggplot2 facet_wrap多变量分面报Group对象未找到错误
报错原因
触发Error in sanitise_dim(nrow) : object 'Group' not found的核心原因是facet_wrap()语法写错:你写的facet_wrap(~Condition, Group)会被ggplot识别为「第一个参数是分面公式~Condition,第二个参数是控制分面行数的nrow参数」,函数会直接在全局环境找名为Group的对象作为行数输入,但Group是数据框内的列,不存在于全局环境,因此直接报错。
修正方案
双变量分面时,所有分面变量都需要写在facet_wrap()的公式右侧,用+连接即可。修正后完整可运行代码如下:
library(tidyverse) library(forcats) df %>% group_by(Condition, Gate = fct_inorder(Gate), Modality, Group) %>% dplyr::summarize( Proportion_Correct = mean(Accuracy), standarderror = sd(Accuracy, na.rm = TRUE)/sqrt(n()), .groups = "drop" # 主动清除分组残留,避免版本兼容问题 ) %>% ggplot(aes(x = Gate, y = Proportion_Correct, color = Modality, group = Modality)) + geom_line() + geom_errorbar( aes(ymin = Proportion_Correct - standarderror, ymax = Proportion_Correct + standarderror), color = "Black", linewidth = .15, width = .3 ) + geom_point(size = 2)+ scale_y_continuous(labels = scales::percent)+ labs(y= "Accuracy", x = "Gate")+ # 双变量分面正确写法,nrow=1强制所有子图横向并排 facet_wrap(~Group + Condition, nrow = 1) + theme_minimal() + scale_color_brewer(palette = "Set1")+ ggtitle("Performance")
调整说明
- 修正分面语法后,会自动生成3个横向排列的子图,顺序依次为Group 1 - Condition A、Group 1 - Condition B、Group 2 - Condition A,完全匹配你的预期输出,不会出现空面板。
- 新增
.groups = "drop"参数主动清除summarize后的残留分组,避免不同tidyverse版本下的分组逻辑差异导致意外报错。 - 误差线的线宽参数使用ggplot2 3.4.0版本后推荐的
linewidth,如果你使用的是旧版本ggplot2,把linewidth = .15改回size = .15即可正常运行。 - 不要使用
facet_grid(Group~Condition)实现该需求,该语法会生成2行2列的分面网格,会多出一个无数据的Group 2 - Condition B空面板。
内容的提问来源于stack exchange,提问作者Ryan Bruno
相关产品推荐
相关产品推荐

