El siguiente conjunto de datos contiene el efecto de la vitamina C en el crecimiento de los dientes. La columna dose se ha convertido en factor y será usada como variable categórica.
# Conjunto de datos de muestra
df <- ToothGrowth
df$dose <- as.factor(df$dose)
Opción 1
Las observaciones se pueden agregar sobre un gráfico de violín con geom_point. Sin embargo, es más recomendable añadirlos con algo de ruido aleatorio con position_jitter, donde seed es el la semilla del generador de números pseudaleatorios (opcional) y width es la cantidad de ruido a lo ancho.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len, fill = dose)) +
geom_violin(alpha = 0.5) +
geom_point(position = position_jitter(seed = 1, width = 0.2)) +
theme(legend.position = "none")

Opción 2
Puedes obtener el mismo resultado usando la función geom_jitter.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len, fill = dose)) +
geom_violin(alpha = 0.5) +
geom_jitter(position = position_jitter(seed = 1, width = 0.2)) +
theme(legend.position = "none")


Si quieres crear un gráfico de violín con puntos en ggplot2 puedes usar geom_dotplot, estableciendo binaxis = "y" y stackdir = "center". Ten en cuenta que dotsize controla el tamaño de los puntos.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len, fill = dose)) +
geom_violin(alpha = 0.5) +
geom_dotplot(binaxis = "y",
stackdir = "center",
dotsize = 0.5) +
theme(legend.position = "none")

Los puntos por defecto son del mismo color que los grupos. Para sobrescribirlo puedes especificar un color dentro de geom_dotplot.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len, fill = dose)) +
geom_violin(alpha = 0.5) +
geom_dotplot(binaxis= "y",
stackdir = "center",
dotsize = 0.5,
fill = 1) +
theme(legend.position = "none")
Una alternativa para agregar puntos de datos sobre un gráfico de violín en ggplot2 es usar la función geom_beeswarm del paquete ggbeeswarm.
# install.packages("ggplot2")
# install.packages("ggbeeswarm")
library(ggplot2)
library(ggbeeswarm)
ggplot(df, aes(x = dose, y = len, fill = dose)) +
geom_violin(alpha = 0.5) +
geom_beeswarm() +
theme(legend.position = "none")

La librería ggbeeswarm también contiene una función llamada geom_quasirandom, que puede ser usada para añadir los puntos dentro de los violines, tal y como puedes ver en el siguiente ejemplo.
# install.packages("ggplot2")
# install.packages("ggbeeswarm")
library(ggplot2)
library(ggbeeswarm)
ggplot(df, aes(x = dose, y = len, fill = dose)) +
geom_violin(alpha = 0.5) +
geom_quasirandom() +
theme(legend.position = "none")

También te puede interesar