Example data.
# Counts
df <- as.data.frame(sapply(seq(2, 10, 2), function(x) rnorm(10, x, 1)))
colnames(df) <- paste0("group_", 1:5)
df$val <- paste0("val_", 1:10)
> df
group_1 group_2 group_3 group_4 group_5 val
1 0.4267759 4.599173 6.256323 8.534080 12.778423 val_1
2 2.9344611 3.649858 7.141283 9.299478 10.735906 val_2
3 0.8156248 3.363994 7.285855 7.503840 9.755979 val_3
4 3.6260469 5.262640 5.610248 9.644565 11.123747 val_4
5 2.7633611 5.229914 6.530228 7.705648 9.742567 val_5
6 0.4645319 4.294645 4.535441 7.936977 11.188125 val_6
7 1.7285739 3.044876 5.599020 7.355119 10.132674 val_7
8 0.9213467 3.447743 7.075501 6.410716 9.288704 val_8
9 2.7842446 3.318985 6.190816 8.367641 10.786482 val_9
10 1.7583467 3.329080 7.518858 7.125112 11.276875 val_10
# Label key
lab <- data.frame(group=paste0("group_", 1:5), lab=seq(1, 9, 2))
> lab
group lab
1 group_1 1
2 group_2 3
3 group_3 5
4 group_4 7
5 group_5 9
Pivot the data to long format and plot.
library("tidyverse")
df %>%
pivot_longer(!val, names_to="group", values_to="count") %>%
ggplot(aes(x=group, y=count)) + geom_violin() +
geom_errorbar(data=lab, aes(x=group, y=lab, ymin=lab, ymax=lab)) +
geom_text(data=lab, aes(x=group, y=lab, label=lab), nudge_x=-0.5) +
stat_summary(geom="errorbar", fun=mean, fun.max=mean, fun.min=mean, lty=2)
Thanks, that help a lot!