I am using R
and ggplot2
to do some plots for publishing purposes. I have come across this plot and I would like to replicate it using ggplot2
. However, I have never seen a plot like this made using ggplot2
.
Can it be done with ggplot2
? What about the text below the bars? I guess these will have to be hard coded in the ggplot2
codes. And how do you align those text?
This gets fairly close:
# Generate sample data (I'm too lazy to type out the full labels)
df <- data.frame(
perc = c(60, 36, 44, 41, 42, 57, 34, 52),
type = rep(c("blue", "green"), 4),
label = rep(c(
"Individual reports created as needed",
"Regular reports on single topics",
"Analytics using data integrated from multiple systems",
"Business unit-specific dashboards and visuals"), each = 2))
library(ggplot2)
ggplot(df, aes(1, perc, fill = type)) +
geom_col(position = "dodge2") +
scale_fill_manual(values = c("turquoise4", "forestgreen"), guide = FALSE) +
facet_wrap(~ label, ncol = 1, strip.position = "bottom") +
geom_text(
aes(y = 1, label = sprintf("%i%%", perc)),
colour = "white",
position = position_dodge(width = .9),
hjust = 0,
fontface = "bold") +
coord_flip(expand = F) +
theme_minimal() +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
strip.text = element_text(angle = 0, hjust = 0, face = "bold"))
A few explanations:
position = "dodge2"
(note that this requires ggplot_ggplot2_3.0.0
, otherwise use position = position_dodge(width = 1.0)
) and position = position_dodge(width = 0.9)
, respectively.facet_wrap
and force a one-column layout; strip labels are moved to the bottom.coord_flip(expand = F)
, where expand = F
ensures that left aligned (hjust = 0
) facet strip texts align with 0.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With