It looks like the stat_ellipse function you found is really a great solution, but here is a different (non-ggplot), write-only, using the dataEllipse from the car package.
# some sample data n=10000 g=4 d <- data.frame(ID = unlist(lapply(letters[1:g], function(x) rep(x, n/g)))) d$x <- unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))) d$y <- unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2)))

# with a little more effort... # random colours with alpha-blending d$col <- unlist(lapply(1:g, function (x) rep(rgb(runif(1), runif(1), runif(1), runif(1)),n/g))) # plot points first with(d, plot(x,y, col=col, pch=".")) # then ellipses over the top with(d, dataEllipse(x, y, ID, level=0.95, fill=TRUE, fill.alpha=0.1, plot.points=FALSE, add=TRUE, col=unique(col), ellipse.label=FALSE, center.pch="+"))

Ben
source share