---
title: "Example gallery"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Example gallery}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 7,
  fig.height = 5
)
```

This gallery shows several ways to use DonutMap. All locations, category
values, and links are simulated for demonstration. They are not observed data.

```{r setup}
library(DonutMap)
library(ggplot2)
library(sf)
```

## Shared data

The examples use a small synthetic network of locations in eastern Canada.
The background layer is a simple `sf` polygon created inside the vignette, so
the gallery does not depend on an external map download.

```{r data}
locations <- data.frame(
  place = c("Hub A", "Hub B", "Hub C", "Hub D", "Hub E", "Hub F"),
  lon = c(-73.6, -72.9, -71.4, -70.8, -69.4, -67.8),
  lat = c(45.5, 46.2, 46.8, 47.7, 48.5, 49.2)
)

categories <- c("Local", "Regional", "Remote")

donut_data <- merge(
  locations,
  data.frame(category = categories),
  by = NULL
)

donut_data$value <- c(
  42, 32, 18,
  28, 64, 22,
  30, 54, 40,
  26, 45, 58,
  20, 38, 72,
  16, 30, 88
)

donut_data$category <- factor(donut_data$category, levels = categories)

flows <- data.frame(
  from = c(
    "Hub A", "Hub A", "Hub B", "Hub B", "Hub C",
    "Hub C", "Hub D", "Hub E", "Hub F"
  ),
  to = c(
    "Hub B", "Hub C", "Hub C", "Hub D", "Hub D",
    "Hub E", "Hub E", "Hub F", "Hub C"
  ),
  volume = c(120, 85, 95, 60, 130, 75, 90, 50, 70),
  corridor = c(
    "Local", "Regional", "Local", "Remote", "Regional",
    "Remote", "Local", "Remote", "Regional"
  )
)

category_colours <- c(
  Local = "#1b9e77",
  Regional = "#7570b3",
  Remote = "#d95f02"
)

background <- sf::st_as_sfc(
  sf::st_bbox(
    c(xmin = -74.5, ymin = 44.8, xmax = -66.8, ymax = 50.0),
    crs = sf::st_crs(4326)
  )
)

study_area <- sf::st_sf(
  area = "Simulated study area",
  geometry = background
)
```

## 1. Static donuts without links

Use `donut_map()` without `flows` when the goal is to compare compositions at
locations.

```{r static-no-flows}
donut_map(
  donut_data,
  place,
  category,
  value,
  lon = lon,
  lat = lat,
  map = study_area,
  crs = 3347,
  radius_range = c(18000, 52000),
  colours = category_colours
) +
  labs(
    title = "Compositions only",
    fill = "Category"
  ) +
  theme(legend.position = "right")
```

## 2. Static map with curved coloured links

Supplying `flows`, `from`, `to`, and `flow_value` draws links between donuts.
The `flow_group` and `flow_colours` arguments colour the links and arrows by a
categorical flow variable.

```{r static-curved-flows}
donut_map(
  donut_data,
  place,
  category,
  value,
  lon = lon,
  lat = lat,
  map = study_area,
  crs = 3347,
  radius_range = c(18000, 52000),
  colours = category_colours,
  flows = flows,
  from = from,
  to = to,
  flow_value = volume,
  flow_group = corridor,
  flow_colours = category_colours,
  flow_curvature = 0.25,
  flow_linewidth_range = c(0.3, 2.4),
  flow_arrow = TRUE
) +
  labs(
    title = "Curved links coloured by corridor",
    fill = "Donut category",
    linewidth = "Volume"
  ) +
  theme(legend.position = "right")
```

## 3. Straight links

Use `flow_curvature = 0` for direct straight links. This is often useful for
small networks where curved trajectories would add visual clutter.

```{r static-straight-flows}
donut_map(
  donut_data,
  place,
  category,
  value,
  lon = lon,
  lat = lat,
  map = study_area,
  crs = 3347,
  radius_range = c(18000, 52000),
  colours = category_colours,
  flows = flows,
  from = from,
  to = to,
  flow_value = volume,
  flow_group = corridor,
  flow_colours = category_colours,
  flow_curvature = 0,
  flow_linewidth_range = c(0.3, 2.4),
  flow_arrow = TRUE
) +
  labs(
    title = "Straight links",
    fill = "Donut category",
    linewidth = "Volume"
  ) +
  theme(legend.position = "right")
```

## 4. Interactive map with filtered links

`donut_leaflet()` creates a clickable `leaflet` widget. The `flow_min` argument
keeps only larger flows, which can make dense networks easier to read.

```{r interactive-filtered}
donut_leaflet(
  donut_data,
  place,
  category,
  value,
  lon = lon,
  lat = lat,
  map = study_area,
  radius_range = c(18000, 52000),
  colours = category_colours,
  flows = flows,
  from = from,
  to = to,
  flow_value = volume,
  flow_group = corridor,
  flow_colours = category_colours,
  flow_min = 80,
  flow_weight_range = c(1, 7),
  flow_curvature = 0.25,
  flow_arrow = TRUE,
  flow_arrow_size = 35000,
  flow_opacity = 0.8
)
```

## 5. Geometry-first workflow

For more customized maps, compute the `sf` layers first and then plot or
transform them yourself.

```{r geometry-first}
donut_layer <- donut_polygons(
  donut_data,
  place,
  category,
  value,
  lon = lon,
  lat = lat,
  crs = 3347,
  radius_range = c(18000, 52000)
)

flow_layer <- flow_lines(
  flows,
  donut_data,
  from,
  to,
  volume,
  place,
  group = corridor,
  lon = lon,
  lat = lat,
  crs = 3347,
  flow_curvature = -0.18,
  flow_n = 50
)

ggplot() +
  geom_sf(
    data = flow_layer,
    aes(linewidth = value, colour = group),
    alpha = 0.7
  ) +
  geom_sf(data = donut_layer, aes(fill = category), colour = "white") +
  scale_colour_manual(values = category_colours) +
  scale_fill_manual(values = category_colours) +
  coord_sf(datum = NA) +
  labs(
    title = "Custom map from sf layers",
    colour = "Flow group",
    fill = "Donut category",
    linewidth = "Volume"
  ) +
  theme_minimal()
```
