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

ggplot2瀑布图添加条形标签与去除边框问题

解决瀑布图的两个问题:添加条形标签与移除黑色边框

问题说明

按教程实现瀑布图后,遇到两个问题:

  • 无法为条形添加数值标签
  • 无法移除图表的黑色边框(常规panel.border = element_blank()方案无效)

解决方案

1. 移除图表黑色边框

在theme()中添加panel.border = element_blank(),同时补充axis.line = element_line(color = "black")保留坐标轴线条。如果是条形自身的黑色边框(由geom_rect的colour="black"参数导致),可将该参数改为colour=NA直接移除。

2. 添加条形标签

使用geom_text(),以条形的垂直中点为标签位置,显示对应数值。可通过scales::dollar()格式化数值,或直接显示原始数值。

修改后的完整代码

library(tidyverse)
library(scales)

df <- tribble(
  ~Category, ~Value, 
  # --------- header record ----------
  "Prev Budget", 5,
  "Salaries", 0.1,
  "CapEx", 0.175,
  "Travel", -0.2,
  "Contracting", -0.1,
  "Operations", -0.2,
  "RealEstate", -0.1,
  "Gap to Target", -0.175,
  "Current Budget", -4.5
)

levels <- df$Category

data1 <- df  %>%
  mutate(Category = factor(Category, levels = levels),
         ymin = round(cumsum(Value), 3),
         ymax = lag(cumsum(Value), default = 0),
         xmin = c(head(Category, -1), NA),
         xmax = c(tail(Category, -1), NA),
         Impact = ifelse(Category %in% c(as.character(df$Category[1]), 
                         as.character(df$Category[nrow(df)])),"Budget",
                         ifelse(Value > 0, "Increase", "Decrease")
         ))

g <- ggplot(data1) +
  theme_bw() +
  theme(legend.position = "right", 
        panel.grid = element_blank(), 
        axis.text.x = element_text(angle = 90, vjust = 0.5),
        # 移除图表边框,保留坐标轴线条
        panel.border = element_blank(),
        axis.line = element_line(color = "black")) +
  labs(y = "USD Millions", x = "Expense Category", 
       title = "Explanation of Budget Gap Closure")

w <- 0.4  # 设置条形宽度

g <- g +
  geom_rect(aes(xmin = as.integer(Category) - w/2,
                xmax = as.integer(Category) + w/2, ymin = ymin, ymax = ymax,
                fill = Impact), 
            # 若要移除条形自身黑色边框,将colour改为NA
            colour = "black") +
  scale_x_discrete(limits = levels) +
  scale_fill_manual(values = c("Decrease" = "blue", "Increase" = "orange", 
                               "Budget" = "black")) +
  # 添加条形标签,格式化数值并设置样式
  geom_text(aes(x = as.integer(Category), 
                y = (ymin + ymax)/2, 
                label = dollar(Value, accuracy = 0.01)),
            color = "white", fontface = "bold")

g <- g +
  geom_segment(data = data1[1:(nrow(data1) -1), ], aes(x = xmin,
                                                       xend = xmax,
                                                       y = ymin,
                                                       yend = ymin))
g

关键改动说明

  • 边框处理:panel.border = element_blank()移除绘图区域的黑色边框,axis.line = element_line(color = "black")保证坐标轴可见;若不需要条形边框,修改geom_rect的colour参数为NA即可。
  • 标签添加:通过(ymin + ymax)/2定位条形垂直中点,用scales::dollar()格式化数值,搭配白色加粗字体提升标签可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:47:35