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

如何在R语言中利用总值与子集值绘制重叠柱状图?

刚好我之前也做过类似的需求,你要的这种重叠柱状图(两个柱子都从X轴起始,而非堆叠/分组)在ggplot2里其实很容易实现,核心就是用position = "identity"参数来替代默认的堆叠或分组布局。下面我结合你的示例数据给出具体实现步骤:

步骤1:准备数据

先把你提供的示例数据转换成R的数据框:

# 构造示例数据
customer_data <- data.frame(
  Year = c(1970, 1971, 1972, 1973, 1974, 1975, 2020),
  Active = c(1, 1, 1, 2, 3, 8, 268),
  New = c(1, 0, 0, 1, 1, 5, 65)
)

步骤2:绘制重叠柱状图

这里的关键是两次调用geom_bar,分别绘制活跃客户和新客户的柱子,并且设置position = "identity"让它们重叠;同时调整alpha透明度,确保两个柱子都能清晰显示:

library(ggplot2)

ggplot(customer_data, aes(x = Year)) +
  # 先画活跃客户的柱子(作为底层)
  geom_bar(aes(y = Active, fill = "Active"), 
           stat = "identity", position = "identity", alpha = 0.7, width = 0.6) +
  # 再画新客户的柱子(叠在上面)
  geom_bar(aes(y = New, fill = "New"), 
           stat = "identity", position = "identity", alpha = 0.9, width = 0.4) +
  # 美化设置
  labs(title = "年度活跃客户与新客户重叠柱状图",
       x = "年份",
       y = "客户数量",
       fill = "客户类型") +
  scale_fill_manual(values = c("Active" = "#1f77b4", "New" = "#ff7f0e")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

关键参数解释

  • position = "identity":这是实现重叠的核心,告诉ggplot不要对柱子进行堆叠或分组,直接按原始位置绘制(从X轴原点开始)。
  • alpha:设置透明度,让底层的活跃客户柱子能透过新客户的柱子显示出来,避免被完全遮挡。
  • width:调整两个柱子的宽度差异,这样即使重叠也能更清晰地看到各自的轮廓(你也可以设置成相同宽度,根据需求调整)。

额外优化建议

  • 如果某些年份新客户数为0(比如1971、1972),对应的柱子会自动消失,不影响图表展示。
  • 如果需要给柱子添加数值标签,可以在每个geom_bar后加上geom_text,比如:
# 给活跃客户柱子加标签
geom_text(aes(y = Active, label = Active), 
          position = position_identity(vjust = -0.5), size = 3) +
# 给新客户柱子加标签
geom_text(aes(y = New, label = New), 
          position = position_identity(vjust = -0.5), size = 3)

这样就能得到你想要的重叠柱状图啦!

内容的提问来源于stack exchange,提问作者Hong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:52:54