Consider the ToothGrowth data set and transform the dose column into a factor.
# Sample data set
df <- ToothGrowth
df$dose <- as.factor(df$dose)
stat_summary
In order to add the mean to the violin plots you need to use the stat_summary function and specify the function to be computed, the geom to be used and the arguments for the geom.
Mean as a point
In case you want to display the mean with points you can pass the mean function and set "point" as a geom. Recall that you can customize other arguments such as shape and size.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len)) +
geom_violin() +
stat_summary(fun = "mean",
geom = "point",
color = "red")

Mean as a line
If you prefer a horizontal line set geom = "crossbar". In this case you can also specify a width for the lines.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len)) +
geom_violin() +
stat_summary(fun = "mean",
geom = "crossbar",
width = 0.5,
colour = "red")

Mean as a crossbar
You can also add the confidence intervals for the mean. For that purpose you have to pass a function (to fun.data) that computes the standard deviation, such as mean_cl_boot for nonparametric boostrap. Type ?mean_cl_boot for more related functions.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len)) +
geom_violin() +
stat_summary(fun.data = "mean_cl_boot", geom = "crossbar",
colour = "red", width = 0.2)

Mean as a pointrange
The standard deviation can be displayed with a pointrange instead of a crossbow.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len)) +
geom_violin() +
stat_summary(fun.data = "mean_cl_boot", geom = "pointrange",
colour = "red")


Mean and median
If you add other stat_summary function but with the median you can have both metrics. You can set the geom you desire as in the previous section.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len)) +
geom_violin() +
stat_summary(fun = "mean",
geom = "point",
color = "red") +
stat_summary(fun = "median",
geom = "point",
color = "blue")

Mean and median (with legend)
Note that setting an aes will create a legend. This legend can be customized, for instance, with scale_color_manual.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = dose, y = len)) +
geom_violin() +
stat_summary(fun = "mean",
geom = "point",
aes(color = "Mean")) +
stat_summary(fun = "median",
geom = "point",
aes(color = "Median")) +
scale_colour_manual(values = c("red", "blue"), # Colors
name = "") # Remove the legend title
See also