Another solution using a function that draws a curly bracket.
Thanks Gur!
curly <- function(N = 100, Tilt = 1, Long = 2, scale = 0.1, xcent = 0.5,
ycent = 0.5, theta = 0, col = 1, lwd = 1, grid = FALSE){
# N determines how many points in each curve
# Tilt is the ratio between the axis in the ellipse
# defining the curliness of each curve
# Long is the length of the straight line in the curly brackets
# in units of the projection of the curly brackets in this dimension
# 2*scale is the absolute size of the projection of the curly brackets
# in the y dimension (when theta=0)
# xcent is the location center of the x axis of the curly brackets
# ycent is the location center of the y axis of the curly brackets
# theta is the angle (in radians) of the curly brackets orientation
# col and lwd are passed to points/grid.lines
ymin <- scale / Tilt
y2 <- ymin * Long
i <- seq(0, pi/2, length.out = N)
x <- c(ymin * Tilt * (sin(i)-1),
seq(0,0, length.out = 2),
ymin * (Tilt * (1 - sin(rev(i)))),
ymin * (Tilt * (1 - sin(i))),
seq(0,0, length.out = 2),
ymin * Tilt * (sin(rev(i)) - 1))
y <- c(-cos(i) * ymin,
c(0,y2),
y2 + (cos(rev(i))) * ymin,
y2 + (2 - cos(i)) * ymin,
c(y2 + 2 * ymin, 2 * y2 + 2 * ymin),
2 * y2 + 2 * ymin + cos(rev(i)) * ymin)
x <- x + xcent
y <- y + ycent - ymin - y2
x1 <- cos(theta) * (x - xcent) - sin(theta) * (y - ycent) + xcent
y1 <- cos(theta) * (y - ycent) + sin(theta) * (x - xcent) + ycent
##For grid library:
if(grid){
grid.lines(unit(x1,"npc"), unit(y1,"npc"),gp=gpar(col=col,lwd=lwd))
}
##Uncomment for base graphics
else{
par(xpd=TRUE)
points(x1,y1,type="l",col=col,lwd=lwd)
par(xpd=FALSE)
}
}
library(ggplot2)
x <- c(runif(10),runif(10)+2)
y <- c(runif(10),runif(10)+2)
qplot(x=x,y=y) +
scale_x_continuous("",breaks=c(.5,2.5),labels=c("Low types","High types") )
curly(N=100,Tilt=0.4,Long=0.3,scale=0.025,xcent=0.2525,
ycent=par()$usr[3]+0.1,theta=-pi/2,col="red",lwd=2,grid=TRUE)
curly(N=100,Tilt=0.4,Long=0.3,scale=0.025,xcent=0.8,
ycent=par()$usr[3]+0.1,theta=-pi/2,col="red",lwd=2,grid=TRUE)