insetplot is an R package to create ggplot2 maps with inset maps easily and flexibly. It handles spatial configuration, aspect ratios, and plot composition automatically.
Use the same plot for the main map and all insets — let insetplot handle sizing and positioning.
library(insetplot)
library(sf)
library(ggplot2)
# Load data
nc <- st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
# Configure insets: one main + one inset
config_insetmap(
data_list = list(nc),
specs = list(
inset_spec(main = TRUE),
inset_spec(
xmin = -84, xmax = -75, ymin = 33, ymax = 37,
loc = "left bottom", scale_factor = 0.5
)
)
)
# Compose
with_inset(
ggplot(nc, aes(fill = AREA)) +
geom_sf() +
scale_fill_viridis_c() +
theme_void()
)Provide specific plots for the main and inset maps.
base_plot <- ggplot(nc, aes(fill = AREA)) +
geom_sf() + scale_fill_viridis_c() + theme_void()
main_plot <- base_plot +
ggtitle("Full North Carolina")
inset_plot <- base_plot +
ggtitle("Detail Region")
config_insetmap(
data_list = list(nc),
specs = list(
inset_spec(main = TRUE, plot = main_plot),
inset_spec(
xmin = -84, xmax = -75, ymin = 33, ymax = 37,
loc = "left bottom", scale_factor = 0.5,
plot = inset_plot
)
)
)
with_inset() # plot argument optional when each spec has its own plotdevtools::install_github("fncokg/insetplot")Full documentation and more examples are available at insetplot package site.
inset_spec() — Define bbox, position, and size for each
subplot
xmin, xmax, ymin, ymaxloc (e.g., “left bottom”) or
loc_left/loc_bottom in [0, 1]scale_factor; or provide one of
width/heightplot: optional custom ggplot objectmain: exactly one spec must set
main = TRUEconfig_insetmap() — Build and store configuration
data_list: list of sf objectsspecs: list of inset_spec()crs: target CRS (passed to coord_sf as
crs)border_args: forwarded to map_border() for
inset borderswith_inset() — Compose main plot with insets
plot: single ggplot or list per spec (optional).as_is: return the input plot as-is (skip inset
composition).return_details: return
list(full, subplots, subplot_layouts, main_ratio)ggsave_inset() — Save with the correct aspect ratio
width or height; the other
is computed from main_ratioratio_scale for small adjustments (e.g.,
legends)map_border() — Small theme to draw a rectangular border
around plotsconfig_insetmap(
data_list = list(nc),
specs = list(
inset_spec(main = TRUE),
inset_spec(
xmin = -84, xmax = -75, ymin = 33, ymax = 37,
loc_left = 0.05, loc_bottom = 0.05,
# Use width only; height auto-calculated to preserve aspect ratio
width = 0.25
)
)
)
with_inset(base_plot)config_insetmap(
data_list = list(nc),
specs = list(
inset_spec(main = TRUE),
inset_spec(
xmin = -84, xmax = -75, ymin = 33, ymax = 37,
loc = "left bottom", scale_factor = 0.5,
)
)
)
with_inset(list(main_plot, inset_plot))ggsave_inset(
"map_with_insets.png",
plot = composed_plot,
# `height` auto-calculated from `main_ratio`
width = 12,
dpi = 300
)result <- with_inset(plot = my_plot, .return_details = TRUE)
# result$full, result$subplots, result$subplot_layouts, result$main_ratio