I am trying to insert difference or variance bars between stacked bar totals in ggplot. I would like the result to look something like the image in this link:

I would like to label these variance bars with the difference between the stacked bars on either side.
Could somebody show me how I can achieve this?
Here is my sample data:
df <-
data.frame(
x.axis.Var = rep(c("Phase1", "Phase2", "Phase3", "Phase4"), 2),
cat.Var = rep(c("High Grade","Low Grade"), each = 4),
values = c(500, 200, 600, 300,
150, 500, 600, 200
)
)
Arranging data:
df.tmp <- df %>%
mutate(
x.axis.Var = factor(x.axis.Var,
levels = c("Phase1", "Phase2", "Phase3", "Phase4")),
cat.Var = factor(cat.Var,
levels = c("High Grade","Low Grade"))
) %>%
arrange(x.axis.Var, desc(cat.Var)) %>%
mutate(end.Bar = cumsum(values),
start.Bar = c(0, head(end.Bar, -1))) %>%
mutate(group.id = group_indices(., x.axis.Var)) %>%
group_by(x.axis.Var) %>%
mutate(total.by.x = sum(values)) %>%
select(x.axis.Var, cat.Var, group.id, start.Bar, values, end.Bar, total.by.x)
Plotting data using ggplot:
ggplot(df.tmp, aes(x = group.id, y = values, fill = cat.Var)) +
geom_bar(stat = "identity",position = "stack", width = 0.3)+
scale_fill_manual(values=c('#ff0000','#c8f464')) +
scale_x_continuous(
expand=c(0,0),
limits = c(min(df.tmp$group.id)-0.5,max(df.tmp$group.id)+0.5),
breaks = c(min(df.tmp$group.id)-0.5,
unique(df.tmp$group.id),
unique(df.tmp$group.id) + 0.5
),
labels =
c("",
as.character(unique(df.tmp$x.axis.Var)),
rep(c(""), length(unique(df.tmp$x.axis.Var)))
)
) +
theme(
text = element_text(size = 5, color = "#4e4d47"),
axis.text = element_text(size = 8, angle = 90, vjust = 0.5, hjust=1, color = "#4e4d47", face =
"bold"),
axis.text.y = element_text(margin = margin(r = 0.3, unit = "cm")),
axis.ticks.x =
element_line(color =
c("black",
rep(NA, length(unique(df.tmp$x.axis.Var))),
rep("black", length(unique(df.tmp$x.axis.Var))-1)
)
),
axis.line = element_line(colour = "#4e4d47", size = 0.5),
axis.ticks.length = unit(.15, "cm"),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.background = element_blank(),
plot.margin = unit(c(1, 1, 1, 1), "lines"),
legend.text = element_text(size = 10,
color = "#4e4d47",
face = "bold",
margin = margin(l = 0.25, unit = "cm")
),
legend.title = element_blank()
)
