ggplot2双向条形图类别顺序不一致问题求助
解决ggplot2横向堆叠条形图正负值顺序不一致的问题
你遇到的问题是:横向堆叠条形图中,负值类别顺序符合预期,但正值类别顺序反转,无法同时匹配图例和图表的正确顺序。这是因为ggplot2默认的position_stack()对横向条形的正负值堆叠方向逻辑不同导致的。
方法一:拆分正负数据分别控制堆叠顺序(推荐)
无需修改原有因子顺序,将数据拆分为正负两组,分别设置堆叠顺序,确保图表和图例顺序一致:
library(ggplot2) library(dplyr) library(tibble) dat <- tribble( ~val, ~cat, ~label, ~order, -10, "Negative 2", "A", 1, -20, "Negative 1", "A", 2, 5, "Positive 1", "A", 3, 10, "Positive 2", "A", 4, 20, "Positive 3", "A", 5 ) |> mutate(cat = factor(cat, levels = unique(cat))) # 拆分正负数据集 dat_neg <- dat |> filter(val < 0) dat_pos <- dat |> filter(val >= 0) |> arrange(order) # 按预期顺序排序正值数据 ggplot() + # 绘制负值,使用默认堆叠顺序(符合预期) geom_col(data = dat_neg, aes(x = val, y = label, fill = cat), color = "transparent", position = position_stack()) + # 绘制正值,反转堆叠顺序以匹配预期 geom_col(data = dat_pos, aes(x = val, y = label, fill = cat), color = "transparent", position = position_stack(reverse = TRUE)) + # 负值标签,保持原堆叠位置 geom_label(data = dat_neg, aes(x = val, y = label, label = order), show.legend = FALSE, color = "white", size = 5, position = position_stack(vjust = .5)) + # 正值标签,同步反转位置 geom_label(data = dat_pos, aes(x = val, y = label, label = order), show.legend = FALSE, color = "white", size = 5, position = position_stack(reverse = TRUE, vjust = .5)) + theme(legend.position = "bottom")
方法二:调整因子顺序并反转图例
通过修改因子的levels顺序,配合图例反转来同步图表和图例的顺序:
dat <- dat |> # 反转正值部分的因子顺序 mutate(cat = factor(cat, levels = c(unique(cat)[1:2], rev(unique(cat)[3:5])))) dat |> ggplot(aes(x = val, y = label, fill = cat)) + geom_col(color = "transparent") + geom_label(aes(label = order), show.legend = FALSE, color = "white", size = 5, position = position_stack(vjust = .5)) + # 反转图例顺序以匹配原预期 scale_fill_discrete(guide = guide_legend(reverse = TRUE)) + theme(legend.position = "bottom")
两种方法都能实现:图表中正负值类别按1,2,3,4,5的顺序排列,同时图例保持原有的正确顺序。
内容的提问来源于stack exchange,提问作者acaciaflower
相关产品推荐
相关产品推荐

