R语言ggplot离散x轴因子未按指定relevel顺序排列问题
你尝试的4种方案失效的核心原因有两点:
- 方法3、4虽然提前修改了
type的因子水平,但后续在scale_x_discrete中指定limits = unique(y$type)时,调用的是未修改的原始数据的type唯一值,覆盖了你提前设置的因子顺序 - 所有方案中
labels的生成逻辑都是基于原始数据type的默认顺序,和你想要的目标顺序不匹配,即使x轴顺序改对了,标签也会出现错位
你可以通过以下两种方案解决问题,首先先定义目标x轴顺序避免重复书写出错:
target_order <- c("Hydro", "Vascular", "Trauma", "Infection", "Tumor")
方案1:提前修改数据的因子水平(更稳妥,后续其他分组统计也会沿用该顺序)
library(tidyverse) library(ggtext) # 修改数据集中type的因子水平为目标顺序 y_fix <- y %>% mutate(type = factor(type, levels = target_order)) ggplot(y_fix, aes(x = type, y = loglos, color = corona, fill = corona)) + geom_boxplot() + scale_y_continuous(name = "", breaks = seq(-8, 0, 4), limits = c(-8, 0)) + # 按目标顺序生成对应标签,p_perc_和p_conf_为命名向量,直接按顺序索引即可匹配 scale_x_discrete(name = "", labels = paste0(target_order, "<br><b>", p_perc_[target_order], "</b>", "<br><sub>(", p_conf_[target_order], ")</sub>")) + theme(axis.text.x = element_markdown(color = "grey20", size = 12))
方案2:直接在scale层设置顺序(不需要修改原始数据)
library(tidyverse) library(ggtext) ggplot(y, aes(x = type, y = loglos, color = corona, fill = corona)) + geom_boxplot() + scale_y_continuous(name = "", breaks = seq(-8, 0, 4), limits = c(-8, 0)) + # 同时指定limits和labels为目标顺序,保证二者一一对应 scale_x_discrete(name = "", limits = target_order, labels = paste0(target_order, "<br><b>", p_perc_[target_order], "</b>", "<br><sub>(", p_conf_[target_order], ")</sub>")) + theme(axis.text.x = element_markdown(color = "grey20", size = 12))
内容的提问来源于stack exchange,提问作者cmirian
相关产品推荐
相关产品推荐

