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(
bbox = st_bbox(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(
bbox = st_bbox(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 plotTo install the released version from CRAN:
install.packages("insetplot")To install the development version from GitHub:
devtools::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
specs: list of inset_spec(),
requiredbbox: overall bounding box (sf bbox or similar),
optional (all specs must have fullly defined bboxes if
omitted)to_crs: target Coordinate Reference System,
optional, by default “EPSG:4326”from_crs: source CRS for non-sf inputs,
optional, by default “EPSG:4326”border_args: forwarded to map_border() for
inset borders, optionalwith_inset() — Compose main plot with insets
plot: single ggplot or list per spec.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(
bbox = st_bbox(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(
bbox = st_bbox(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",
# `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