我按照这些说明创建了一个瀑布图。
不幸的是,到目前为止我没能做到
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)) +
labs(y = "USD Millions", x = "Expense Category",
title = "Explanation of Budget Gap Closure")
w <- 0.4 #use to set width of bars
g <- g +
geom_rect(aes(xmin = as.integer(Category) - w/2,
xmax = as.integer(Category) + w/2, ymin = ymin, ymax = ymax,
fill = Impact), colour = "black") +
scale_x_discrete(limits = levels) +
scale_fill_manual(values = (c("Decrease" = "blue", "Increase" = "orange",
"Budget" = "black")))
g <- g +
geom_segment(data = data1[1:(nrow(data1) -1), ], aes(x = xmin,
xend = xmax,
y = ymin,
yend = ymin))
g
我通过论坛进行了搜索,但似乎通常的解决方案在瀑布图中不起作用(例如,panel.border = element_blank())。
要删除面板边框,请使用
theme(panel.border = element_blank())
(不确定为什么它不适合您)。要向图表添加标签,您可以使用 geom_text
。由于您没有指定要添加到图表中的标签以及要放置标签的位置,因此我选择了总计,我将正值放在顶部,负值放在底部:
library(ggplot2)
g +
geom_text(
aes(
x = as.integer(Category),
y = ymin + if_else(Value > 0, + .1, -.1),
vjust = if_else(Value > 0, 0, 1),
label = ymin
)
) +
theme(panel.border = element_blank())