ggplot箱线图指定顺序重排异常:仅显示单个箱线图的排查
解决ggplot箱线图自定义因子顺序失效问题
问题背景
使用ggplot绘制箱线图时,age_group默认按字母顺序(Middle、Old、Young)排列,需要调整为指定的Young、Middle、Old顺序。尝试将age_group转为因子并指定levels后,仅显示单个箱线图,且数据无缺失值。
初始绘制代码:
stride %>% ggplot(aes(x=age_group,y=stride_int)) + geom_boxplot(outlier.colour = "red", outlier.shape = 21, outlier.fill = "red", outlier.size = 2) + theme_light() + labs(title = "Stride interval for different age groups", y = "stride interval", x = "age group")
尝试的修改代码(失效):
stride %>% arrange(age_group) %>% mutate(age_group = factor(age_group, levels=c("young", "middle", "old"))) %>% ggplot( aes(x=age_group, y=stride_int)) + geom_boxplot(outlier.colour = "red", outlier.shape = 21, outlier.fill = "red", outlier.size = 2) + theme_light() + labs(title = "Stride interval for different age groups", y = "stride interval", x = "age group")
问题原因
因子levels的大小写与数据中age_group的取值不匹配:数据中age_group的值是首字母大写的Young、Middle、Old,但代码中指定的levels是小写的young、middle、old,导致所有原始值都不在指定的levels范围内,被自动转化为NA,最终ggplot仅绘制了NA组的箱线图。
另外,arrange(age_group)这一步是多余的,因子的顺序由levels参数决定,与数据排序无关。
正确代码
stride %>% mutate(age_group = factor(age_group, levels=c("Young", "Middle", "Old"))) %>% ggplot(aes(x=age_group, y=stride_int)) + geom_boxplot(outlier.colour = "red", outlier.shape = 21, outlier.fill = "red", outlier.size = 2) + theme_light() + labs(title = "不同年龄组的步幅间隔", y = "步幅间隔", x = "年龄组")
效果验证
使用你提供的简化数据测试,修改后会正确显示三个按Young→Middle→Old顺序排列的箱线图,符合需求。
内容的提问来源于stack exchange,提问作者NLC
相关产品推荐
相关产品推荐

