In attempting to answer this question, one way to create the desired plot was to use geom_dotplot from ggplot2 as follows:
library(ggplot2)
library(reshape2)
CTscores <- read.csv(text="initials,total,interest,slides,presentation
CU,1.6,1.7,1.5,1.6
DS,1.6,1.7,1.5,1.7
VA,1.7,1.5,1.5,2.1
MB,2.3,2.0,2.1,2.9
HS,1.2,1.3,1.4,1.0
LS,1.8,1.8,1.5,2.0")
CTscores.m = melt(CTscores, id.var="initials")
ggplot(CTscores.m, aes(x=variable, y=value)) +
geom_dotplot(binaxis="y", stackdir="up",binwidth=0.03) +
theme_bw()+coord_flip()

In order to distinguish the points, it would be convenient to just add color, but geom_dotplot chokes on color and doesn't end up stacking them:
ggplot(CTscores.m, aes(x=variable, y=value, fill=initials)) +
geom_dotplot(binaxis="y", stackdir="up",binwidth=0.03,color=NA) +
theme_bw()+coord_flip()

Color can be added manually using a hack, though:
gg_color_hue <- function(n) {
hues = seq(15, 375, length=n+1)
hcl(h=hues, l=65, c=100)[1:n]
}
cols <- rep(gg_color_hue(6),4)
ggplot(CTscores.m, aes(x=variable, y=value)) +
geom_dotplot(binaxis="y", stackdir="up",binwidth=0.03,fill=cols,color=NA) +
theme_bw()+coord_flip()

Unfortunately, there's no legend. On top of that we can't use aes(fill=) to try to add a legend manually because it will collapse the dots. Is there any way to add a legend without using aes()?
With the help of the gtable package you can extract the legend from the plot with the legend which fails to stack the dots and add that legend with grid.arrange from the gridExtra package to the plot with the colored ans stacked dots as follows:
p1 <- ggplot(CTscores.m, aes(x=variable, y=value)) +
geom_dotplot(binaxis="y", stackdir="up", binwidth=0.03, fill=cols, color=NA) +
coord_flip() +
theme_bw()
p2 <- ggplot(CTscores.m, aes(x=variable, y=value, fill=initials)) +
geom_dotplot(binaxis="y", stackdir="up", binwidth=0.03, color=NA) +
coord_flip() +
theme_bw()
library(gtable)
fill.legend <- gtable_filter(ggplot_gtable(ggplot_build(p2)), "guide-box")
legGrob <- grobTree(fill.legend)
library(gridExtra)
grid.arrange(p1, legGrob, ncol=2, widths = c(4,1))
which gives:

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With