dittoDotPlot from the dittoSeq package. Much easier than from scratch. The resulting plot is still a ggplot2 object, so you can customize as you'd like. Though the function itself is also quite flexible. Works natively on SingleCellExperiment, Seurat, or SummarizedExperiment objects and can use gene expression and/or continuous metadata variables as desired.
So all you'd have to do is grab your top 5 markers for each cluster or what have you and feed them in along with your data object:
your_markers <- c("Gfap", "Vim", "Aqp4") dittoDotPlot(sce_seurat_or_se_object, your_markers, group.by = "cluster_metadata_column") + coord_flip()