library(ggplot2)
library(microbenchmark)
ids <- factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3"))

values <- data.frame(
  id = ids,
  value = c(3, 3.1, 3.1, 3.2, 3.15, 3.5)
)

positions <- data.frame(
  id = rep(ids, each = 4),
  x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
        0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
  y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
        2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)
)

No actual plot creation

This does a ggplot2 object creation but no plot (so no code that does the hard bits gets executed).

microbenchmark(
  poly = {
    datapoly <- merge(values, positions, by = c("id"))
    ggplot(datapoly, aes(x = x, y = y)) + geom_polygon(aes(fill = value, group = id))
  }
  ,
  map = {
    ggplot() +
            geom_map(data = values, map = positions,
                     aes(map_id = id, fill = value)) +
            expand_limits(positions)
  }
) -> mb2

autoplot(mb2) + aes(fill = expr) +
  viridis::scale_fill_viridis(discrete=TRUE) +
  hrbrthemes::theme_ipsum_rc(grid="X") +
  theme(legend.position="none")

Plot creation

This exercises the “hard bits”

tf <- tempfile(fileext = ".pdf")
pdf(tf, onefile = TRUE)
microbenchmark(
  poly = {
    datapoly <- merge(values, positions, by = c("id"))
    print(ggplot(datapoly, aes(x = x, y = y)) + geom_polygon(aes(fill = value, group = id)))
  }
  ,
  map = {
    print(ggplot() +
            geom_map(data = values, map = positions,
                     aes(map_id = id, fill = value)) +
            expand_limits(positions))
  }
) -> mb
dev.off()
## quartz_off_screen 
##                 2
unlink(tf)

autoplot(mb) + aes(fill = expr) +
  viridis::scale_fill_viridis(discrete=TRUE) +
  hrbrthemes::theme_ipsum_rc(grid="X") +
  theme(legend.position="none")