You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:23:21