如何用ggplot2创建按Group定义填充、X变量定义边框的堆叠条形图?
解决ggplot2百分比堆叠条形图的边框色与填充色映射问题
需求说明
要制作百分比堆叠条形图,满足:
- X轴为
Region(4个水平),每个区域对应一个条形 - 条形内部按
Geology(3个水平)填充颜色,展示各地质类型的占比 - 每个区域的条形拥有独立的边框颜色,与
Region变量绑定
问题排查与解决
初始代码问题
你最初的代码里添加了group=Geology,这会强制ggplot按地质类型分组,干扰了color=Region的边框渲染逻辑——边框无法按整个区域的条形绘制,同时默认stat="count"下,分组逻辑冲突导致报错、边框不生效。
二次修改代码问题
添加stat="identity"和y=1后,相当于给每一行数据都绘制了高度为1的小条形,堆叠后就变成了对应观测数的细碎片段,完全不符合“按地质类型百分比堆叠”的需求。
正确代码实现
移除多余的group参数,让ggplot自动根据x和fill的映射处理分组,就能同时实现百分比堆叠和区域边框色的需求:
ggplot(All_data) + geom_bar( position = "fill", aes(x = Region, fill = Geology, color = Region), show.legend = TRUE ) + theme_classic() + ggtitle("Geology") + scale_y_continuous(name = NULL, labels = NULL) + scale_color_manual( values = c("#B71C1C", "#923ffc", "#fce571", "#70C339") ) + scale_fill_manual( values = c("#555555", "#999999", "#DDDDDD") ) + scale_x_discrete( labels = c("Alps","Central Highlands","Central Plains","Iberia"), name = NULL, guide = guide_axis(angle = 45) )
关键逻辑说明
- 移除
group=Geology:ggplot会自动基于x=Region和fill=Geology构建正确的分组,确保每个区域的条形是一个整体,边框能完整覆盖整个条形 position="fill":自动将每个区域下的地质类型计数转换为百分比,实现堆叠占比的效果color=Region直接映射到aes:因为每个区域的条形是独立整体,边框颜色会精准绑定到对应区域的条形上
内容的提问来源于stack exchange,提问作者Andrés Peredo
相关产品推荐
相关产品推荐

