ggplot堆叠柱状图:移除同类别色块分隔线并添加类别黑色分隔框
解决方法
核心思路是先算出每个年份里data2+data3的总高度,然后只在data和这个总高度的交界处画黑色分隔线,而非给data2、data3各自加框。
方案一:合并data2和data3为同一分组(统一填充色)
如果不需要区分data2和data3的填充色,直接将它们归为同一类别,同时保留与data的分隔线,可用以下代码:
library(tidyverse) year <- 2022:2026 data <- 15:11 data2 <- 10:6 data3 <- 1:5 dat <- tibble(year, data, data2, data3) # 预处理数据:合并data2和data3为同一分组,计算分组总高度 data_processed <- dat %>% pivot_longer(all_of(starts_with('data'))) %>% mutate(group = case_when( name %in% c('data2', 'data3') ~ 'group_23', TRUE ~ 'group_data' )) %>% group_by(year, group) %>% summarise(value = sum(value), .groups = 'drop') %>% group_by(year) %>% mutate(data_height = value[group == 'group_data']) %>% ungroup() # 绘图:堆叠柱状图 + 仅在data与group_23交界处画分隔线 ggplot(data_processed, aes(x = year, y = value, fill = group)) + geom_col(position = 'stack') + geom_segment( data = data_processed %>% distinct(year, data_height), aes(x = year - 0.4, xend = year + 0.4, y = data_height, yend = data_height), color = 'black', size = 2 )
方案二:保留data2和data3的独立填充色
如果要保留data2和data3各自的填充色,仅去掉它们之间的分隔线,保留与data的分隔,可用以下代码:
library(tidyverse) year <- 2022:2026 data <- 15:11 data2 <- 10:6 data3 <- 1:5 dat <- tibble(year, data, data2, data3) # 预处理数据:计算每个年份data的高度(即分隔线位置) data_processed <- dat %>% pivot_longer(all_of(starts_with('data'))) %>% group_by(year) %>% mutate(data_height = value[name == 'data']) %>% ungroup() # 绘图:堆叠柱状图 + 仅在data顶部画分隔线 ggplot(data_processed, aes(x = year, y = value, fill = name)) + geom_col(position = 'stack') + geom_segment( data = data_processed %>% distinct(year, data_height), aes(x = year - 0.4, xend = year + 0.4, y = data_height, yend = data_height), color = 'black', size = 2 )
代码说明
- 两种方案都通过
geom_segment精准绘制分隔线,只在data与下方类别交界处画一条粗黑线,避免了原代码中data2和data3之间的多余分隔; - 方案一适合需要将
data2和data3视为同一大类的场景,方案二保留了三个类别的独立视觉区分。
内容的提问来源于stack exchange,提问作者gaut
相关产品推荐
相关产品推荐

