I have following barchart drawn using ggplot2
in R
. We would like to I would like to draw blue line for "Total" values. I tried using geom_linerange
and geom_errorbar
, but was not successful, how can I get the blue lines for hosrizantal bar chart?
dat=read.csv(textConnection(
"Category,Value1,Value2,Total,Group
A,10,10,20,1
B,20,30,50,1
C,5,2,7,1
D,5,10,15,2
E,10,20,30,2
F,30,4,34,2"))
library(tidyverse)
library(ggplot2)
dat %>%
arrange(desc(Group), Total) %>%
mutate(Category = fct_inorder(Category)) %>%
pivot_longer(Value1:Total) -> dat2
ggplot(filter(dat2, !name %in% c("Value2","Total")),
aes(value, Category, label = value)) +
geom_col(aes(fill = name), position = position_stack(reverse = TRUE)) +
geom_text(position = position_stack(vjust = 0.5, reverse = TRUE)) +
geom_text(data = filter(dat2, name == "Total"),
hjust = -0.5
)
>Solution :
You can achieve your desired result using a geom_segment
where for the y
and yend
aes you have to convert Category
to a numeric and shift by +/- the half bar width which by default is .9 / 2 = .45
:
library(ggplot2)
ggplot(
dplyr::filter(dat2, !name %in% c("Value2", "Total")),
aes(value, Category, label = value)
) +
geom_col(aes(fill = name), position = position_stack(reverse = TRUE)) +
geom_segment(
data = filter(dat2, name == "Total"),
aes(
xend = value,
y = as.numeric(factor(Category)) - .45,
yend = as.numeric(factor(Category)) + .45
),
color = "blue"
) +
geom_text(position = position_stack(vjust = 0.5, reverse = TRUE)) +
geom_text(
data = filter(dat2, name == "Total"),
hjust = -0.5
)