Create violin plot with specific value label that corresponding to graph

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=str_glue("group_{n}", n=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)

enter image description here

Read more here: Source link