如何在ggplot2堆叠条形图上添加总计标记线?
在堆叠条形图上添加Total列的标记线条
数据预处理
你的数据集每个国家对应两行数据,Total值重复,先提取每个国家唯一的Total记录,保证后续绘制不重复:
library(dplyr) # 假设原始数据框名为df total_data <- df %>% distinct(Country, Total) %>% mutate(y_pos = reorder(Country, Total)) # 和绘图的y轴排序完全对齐
修改绘图代码
在你原有的ggplot代码基础上,添加geom_segment来绘制Total标记线,这里提供两种常用方案:
方案1:垂直标记线(精准定位Total值位置)
直接在每个国家的y轴位置,画一条垂直于x轴的虚线标记Total数值:
library(ggplot2) ggplot(df, aes(x = Value, y = reorder(Country, Total), fill = Type)) + geom_bar(stat = "identity", color = "black") + scale_fill_manual(values=c("#1E8BC3", "#E85B4E")) + geom_vline(xintercept = 0, size = 1) + # 添加Total垂直标记线 geom_segment(data = total_data, aes(x = Total, xend = Total, y = y_pos, yend = y_pos), color = "#2ECC71", size = 1.2, linetype = "dashed") + # 可选:添加Total数值标签,自动调整位置避免遮挡 geom_text(data = total_data, aes(x = Total, y = y_pos, label = Total), color = "#27AE60", size = 4, hjust = ifelse(total_data$Total > 0, -0.2, 1.2))
方案2:水平参考线(展示Total与0的差值)
绘制从x=0到x=Total的水平线条,更直观展示总和与零点的关系:
ggplot(df, aes(x = Value, y = reorder(Country, Total), fill = Type)) + geom_bar(stat = "identity", color = "black") + scale_fill_manual(values=c("#1E8BC3", "#E85B4E")) + geom_vline(xintercept = 0, size = 1) + # 添加从0到Total的水平参考线 geom_segment(data = total_data, aes(x = 0, xend = Total, y = y_pos, yend = y_pos), color = "#F39C12", size = 1, linetype = "dotdash") + # 添加带说明的标签 geom_text(data = total_data, aes(x = Total, y = y_pos, label = paste("总和:", Total)), color = "#D35400", size = 3.5, hjust = ifelse(total_data$Total > 0, 0, 1))
关键说明
distinct(Country, Total):剔除重复的Total记录,避免同一国家绘制多条重复线条。reorder(Country, Total):确保Total数据的y轴位置和堆叠条形图完全匹配,不会错位。hjust参数:根据Total值的正负自动调整标签位置,防止被条形图遮挡。
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

