ggplot2中geom_errorbar多变量按upper值降序排序问题
问题:ggplot2中按Errorbar上边界值排序分组内及跨维度的误差棒
原始代码与需求
以下是生成初始可视化的代码:
library(ggplot2) mydat <- data.frame(mean = c(23, 24, 15, 27, 18, 19, 23, 20, 32), lower = c(20, 19, 13, 15, 14, 18, 20, 17, 20), upper = c(25, 29, 17, 39, 22, 20, 26, 23, 40), class = c("A", "B", "C", "A", "B", "C", "A", "B", "C"), domain = c("North", "North", "North", "West", "West", "West", "South", "South", "South")) mydat$class <- as.factor(mydat$class) mydat$domain <- as.factor(mydat$domain) mydat %>% ggplot(aes(x = mean, y = class, color = domain, Group = domain, xmin = lower, xmax = upper)) + geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) + theme_light() + geom_point(position = position_dodge(width = 0.5)) + xlab("Counts")
当前生成的可视化效果如图所示,需求为:让geom_errorbar同时在每个class分组内以及跨domain维度,按照errorbar的upper边界值降序排列,目标效果如图所示。
尝试过的无效代码
曾使用forcats包调整因子顺序,但未达到预期:
library(forcats) mydat %>% ggplot(aes(x = mean, y = class, color = fct_infreq(domain), Group = fct_infreq(domain), xmin = lower, xmax = upper)) + geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) + theme_light() + geom_point(position = position_dodge(width = 0.5)) + xlab("Counts")
正确实现方法
要实现需求,需同时调整class在y轴的排序(跨维度按upper降序),以及每个class内domain的 dodge 顺序(分组内按upper降序),完整代码如下:
library(ggplot2) library(dplyr) library(forcats) mydat <- data.frame(mean = c(23, 24, 15, 27, 18, 19, 23, 20, 32), lower = c(20, 19, 13, 15, 14, 18, 20, 17, 20), upper = c(25, 29, 17, 39, 22, 20, 26, 23, 40), class = c("A", "B", "C", "A", "B", "C", "A", "B", "C"), domain = c("North", "North", "North", "West", "West", "West", "South", "South", "South")) %>% mutate(class = as.factor(class), domain = as.factor(domain)) %>% # 1. 按class分组计算组内最大upper值,以此对class因子降序重排 group_by(class) %>% mutate(class_max_upper = max(upper)) %>% ungroup() %>% mutate(class = fct_reorder(class, -class_max_upper)) %>% # 2. 按class分组,对domain按自身upper值降序重排,生成控制dodge顺序的新因子 group_by(class) %>% mutate(domain_ordered = fct_reorder(domain, -upper)) %>% ungroup() # 绘制图形 mydat %>% ggplot(aes(x = mean, y = class, color = domain, group = domain_ordered, # 用排序后的因子控制分组内的dodge顺序 xmin = lower, xmax = upper)) + geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) + geom_point(position = position_dodge(width = 0.5)) + theme_light() + xlab("Counts")
代码说明
fct_reorder(class, -class_max_upper):将y轴的class因子按每个组的最大upper值降序排列,实现跨维度的整体排序;fct_reorder(domain, -upper):在每个class分组内,将domain按自身的upper值降序排列,生成的domain_ordered作为group参数的依据,控制误差棒在分组内的显示顺序;position_dodge(width = 0.5):确保重新排序后的分组能正确错开,避免重叠。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

