library(tidyverse)
set.seed(19)
map_dfr(letters[2:6],~tibble(x=sample(2:6,3),y=sample(2:6,3),z=.x))|>ggplot(aes(x,y,fill=z))+ggforce::geom_mark_hull()+geom_point(size=5)+coord_fixed()+xlim(0,8)+ylim(0,8)+scale_fill_viridis_d(option="B")+cowplot::theme_nothing()

0 2

The whole geom_mark_*() family together at last - adaptive annotation of your data!

87 331

A new family of geoms enters - geom_mark_*.

First off: geom_mark_hull()

89 301