My made up data:
structure(list(pillar = c("1", "1", "1", "1", "1", "1", "1",
"1", "1", "1", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2",
"3", "3", "3", "3", "3", "3", "3", "3", "3", "3"), budget = c("red",
"red", "red", "red", "red", "red", "green", "green", "red", "green",
"red", "yellow", "red", "red", "yellow", "yellow", "red", "red",
"yellow", "red", "green", "red", "red", "red", "red", "yellow",
"red", "red", "red", "red"), schedule = c("red", "green", "red",
"yellow", "red", "yellow", "yellow", "red", "red", "yellow",
"yellow", "green", "red", "green", "red", "red", "yellow", "yellow",
"red", "yellow", "green", "yellow", "red", "green", "yellow",
"yellow", "green", "green", "green", "red"), scope = c("green",
"red", "green", "red", "yellow", "green", "green", "green", "red",
"red", "red", "yellow", "green", "red", "red", "red", "yellow",
"yellow", "red", "red", "green", "red", "red", "green", "red",
"red", "red", "green", "green", "red"), risk = c("yellow", "red",
"green", "yellow", "yellow", "yellow", "green", "green", "green",
"green", "green", "green", "red", "yellow", "yellow", "yellow",
"green", "green", "red", "green", "red", "yellow", "yellow",
"green", "yellow", "yellow", "red", "yellow", "green", "yellow"
), resources = c("red", "green", "green", "green", "yellow",
"green", "green", "green", "red", "green", "green", "green",
"green", "yellow", "green", "green", "yellow", "green", "green",
"green", "red", "green", "green", "red", "green", "green", "red",
"green", "yellow", "green")), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -30L))
This tidyverse
approach first pivots to a longer data frame structure, then counts the occurrences of each color by pillar and variable. The complete
step fills in empty combinations, to allow for empty columns in the plot.
library(tidyverse)
df %>%
pivot_longer(-pillar) %>%
count(pillar, name, value) %>%
complete(pillar, name, value, fill = list(n = 0)) %>%
ggplot(aes(name, n, fill = factor(value, levels = c('green','yellow','red')))) +
geom_col(position = position_dodge2(0.7, preserve = 'single'), width = 0.6, ) +
facet_wrap(~ pillar,
labeller = label_both) +
scale_fill_manual(values = c('green','yellow','red')) +
labs(x = '', y = 'Count') +
theme(legend.position = 'none')

Created on 2023-04-21 with reprex v2.0.2