如何让ggplot中grp_2按因子水平顺序连接组均值线?
解决ggplot中按因子水平顺序连线的问题
问题原因
geom_line默认会按照x轴变量(est)的数值大小连接点,而非level的因子顺序。grp_1的连线看似正常,只是因为它的est数值刚好和level顺序匹配;grp_2的est数值乱序,所以连线也跟着乱了。
解决方案
要让连线严格遵循level的因子顺序,只需确保每个分组(grp)内的数据按level排序,geom_line就会按该顺序连接点。
方式一:预处理数据时排序
修改数据生成代码,添加arrange(grp, level)来排序:
library(tidyverse) # 生成数据集并排序 dat <- data.frame (level = c("level 1", "level 2", "level 3", "level 4","level 1", "level 2", "level 3", "level 4"), grp = c("grp_2","grp_2","grp_2","grp_2","grp_1","grp_1","grp_1","grp_1"), est = c(0, 0.739, 1.39, -1.85,0, -0.587, -1.02, -3.30)) %>% as_tibble() %>% mutate(level = as.factor(level), grp = as.factor(grp)) %>% arrange(grp, level) # 按分组和level因子顺序排序 # 绘图 dat %>% ggplot(aes(x = est, y = fct_rev(level))) + geom_line(aes(group = grp)) + facet_grid(~ grp) + geom_vline( xintercept = 0, linetype = 6, size = 0.4, colour = "black" ) + labs( x = "Mean of something", y = 'Highest qualification') + theme_bw()
方式二:绘图时临时排序(不修改原数据)
如果不想改动原数据,可以在geom_line的data参数中传入排序后的子集:
library(tidyverse) # 生成原数据集 dat <- data.frame (level = c("level 1", "level 2", "level 3", "level 4","level 1", "level 2", "level 3", "level 4"), grp = c("grp_2","grp_2","grp_2","grp_2","grp_1","grp_1","grp_1","grp_1"), est = c(0, 0.739, 1.39, -1.85,0, -0.587, -1.02, -3.30)) %>% as_tibble() %>% mutate(level = as.factor(level), grp = as.factor(grp)) # 绘图时指定排序数据给geom_line dat %>% ggplot(aes(x = est, y = fct_rev(level))) + geom_line(aes(group = grp), data = . %>% arrange(grp, level)) + facet_grid(~ grp) + geom_vline( xintercept = 0, linetype = 6, size = 0.4, colour = "black" ) + labs( x = "Mean of something", y = 'Highest qualification') + theme_bw()
效果说明
修改后,grp_2的连线会和grp_1保持一致,严格按照level的因子顺序(对应y轴从下到上的level 4到level 1)连接各点,不再受x轴数值的干扰。
内容的提问来源于stack exchange,提问作者Mohamed Yusuf
相关产品推荐
相关产品推荐

