starter code

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6      ✔ purrr   0.3.4 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.2      ✔ forcats 0.5.2 
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
adata = c(50,55,60,60,60,61,65,65,65,66,70,70,75,75,80,80,85,90,95,99)
bdata = c(50,65,65,60,60,70,70,70,75,75,75,80,80,80,80,80,80,80,85,85,85,90,90,95)
dfa = tibble(score=adata) %>% mutate(class="A")
dfb = tibble(score=bdata) %>% mutate(class="B")
df <- bind_rows(dfa,dfb) %>% mutate(class = factor(class, levels=c("A","B")))

plot

ggplot(df, aes(score)) +
  geom_dotplot(binwidth = 5, dotsize = 0.5) +
  facet_wrap(~class, ncol =1) +
  ylab('') +
  theme(
    axis.text.y=element_blank(),
    axis.ticks.y=element_blank(),
    panel.grid.minor.y=element_blank(),
    panel.grid.major.y=element_blank()
  )

advanced

n=300
df33 = tibble(x=runif(n)*100, y=runif(n)*100) %>% mutate(x=round(x), y=round(y))
dsum33 = df33 %>% summarize(mx = mean(x), my=mean(y), sx=sd(x), sy=sd(y), width=sx, height=sy)
mx = dsum33 %>% .[['mx']]
my = dsum33 %>% .[['my']]

plot

ggplot(df33) +
  geom_point(aes(x,y)) +
  theme_light()