---
title: "Visualization tools"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Visualization tools}
  %\VignetteEncoding{UTF-8}
  %\VignetteEngine{knitr::rmarkdown}
editor_options: 
  chunk_output_type: inline
---

```{r include=FALSE}
knitr::opts_chunk$set(collapse  = TRUE,
                      comment   = "#>",
                      out.width = "50%",
                      dpi       = 96,
                      fig.align = "center")
```


The package `chessboard` provides some plotting functions to:

- visualize data on a chessboard
- visualize matrices
- visualize data on a map

All these functions have been implemented using the 
[`ggplot2`](https://ggplot2.tidyverse.org/) package, meaning that they are highly
customizable.


```{r 'setup', echo=TRUE}
# Setup ----
library("chessboard")
library("ggplot2")
```

To illustrate these plotting functions, let's import the data provided by `chessboard`
(see the [Get started](https://frbcesab.github.io/chessboard/articles/chessboard.html) 
vignette for a full description).


```{r 'import-adour-sites', echo=TRUE}
# Location of the data ----
path_to_file <- system.file("extdata", "adour_survey_sampling.csv", 
                            package = "chessboard")

# Read the data ----
sampling  <- read.csv(path_to_file)

head(sampling)
```

For the purpose of this vignette, let's subset the first location.

```{r 'subset-adour-sites', echo=TRUE}
# Subset location 1 ----
sampling <- sampling[sampling$"location" == 1, ]

sampling
```

The sampling is a grid of dimensions 3 transects x 5 quadrats.

When working with `chessboard`, the first step is to create node
labels with the function `create_node_labels()`.

```{r 'create-nodes-labels', echo=TRUE}
# Create node labels ----
nodes <- create_node_labels(data     = sampling,
                            location = "location",
                            transect = "transect", 
                            quadrat  = "quadrat")

nodes
```





## Visualizing chessboard

### gg_chessboard

The first plotting function to use is `gg_chessboard()`: it will plot the (spatial) sampling as
a chessboard, i.e. two-dimension grid where the x-axis is the transect and the
y-axis is the quadrat.


```{r 'gg-chessboard', echo=TRUE, dpi=150, fig.height=8, fig.width=5}
# Plot the sampling as a chessboard ----
gg_chessboard(nodes)
```


### geom_node

On this chessboard, we can locate one specific node using the function `geom_node()`.

```{r 'geom-piece', echo=TRUE, dpi=150, fig.height=8, fig.width=5}
# Locate one node ----
gg_chessboard(nodes) +
  geom_node(nodes, focus = "2-3")
```

We can call the function `geom_node()` several times to emphase various nodes.


```{r 'geom-pieces', echo=TRUE, dpi=150, fig.height=8, fig.width=5}
# Locate various nodes ----
gg_chessboard(nodes) +
  geom_node(nodes, focus = "2-3") +
  geom_node(nodes, focus = "1-5") +
  geom_node(nodes, focus = "3-1")
```


### geom_neighbors

As mentioned in the [Get started](https://frbcesab.github.io/chessboard/articles/chessboard.html) 
vignette, we can test the neighbors detection of a specific node by using the
functions `pawn()`, `fool()`, `rook()`, etc.

Let's apply the function `rook()` on the node `2-3`.

```{r 'nb-rook', echo=TRUE}
# Neighbors detection ----
nb_rook <- rook(nodes, focus = "2-3")

nb_rook
```

Let's visualize these neighbors on a chessboard by using the function `geom_neighbors()`.


```{r 'geom-neighbors', echo=TRUE, dpi=150, fig.height=8, fig.width=5}
# Locate neighbors ----
gg_chessboard(nodes) +
  geom_node(nodes, focus = "2-3") +
  geom_neighbors(nodes, neighbors = nb_rook)
```


### geom_edges

Instead of plotting the neighbors, we can directly plot the edges using the function
`geom_edges()`. This function has the advantage to show the direction of the edges.

```{r 'geom-edges', echo=TRUE, dpi=150, fig.height=8, fig.width=5}
# Locate neighbors ----
gg_chessboard(nodes) +
  geom_edges(nodes, focus = "2-3", neighbors = nb_rook) +
  geom_node(nodes, focus = "2-3")
```


Now let's call the function `bishop()` to create a second edge list.


```{r 'nb-bishop', echo=TRUE}
# Neighbors detection ----
nb_bishop <- bishop(nodes, focus = "2-3")

nb_bishop
```


As for the function `geom_node()`, we can call the functions `geom_edges()` 
and `geom_neighbors()` several times.

```{r 'geom-edges-twice', echo=TRUE, dpi=150, fig.height=8, fig.width=5}
# Locate neighbors ----
gg_chessboard(nodes) +
  geom_edges(nodes, focus = "2-3", neighbors = nb_rook) +
  geom_edges(nodes, focus = "2-3", neighbors = nb_bishop) +
  geom_neighbors(nodes, neighbors = nb_rook) +
  geom_neighbors(nodes, neighbors = nb_bishop) +
  geom_node(nodes, focus = "2-3")
```



## Plotting matrices


These two previous moves (rook and bishop) combined together are equivalent to the [queen](https://en.wikipedia.org/wiki/Queen_(chess)).
For the rest of the vignette let's create the edge list using the queen move.


```{r 'edges-queen', echo=TRUE}
# Edges list ----
edges <- create_edge_list(nodes, method = "queen")

head(edges)
```


From this edge list, we can build the associated connectivity matrix with the
function `connectivity_matrix()`.

```{r 'connectivity-matrix', echo=TRUE}
# Connectivity matrix ----
mat <- connectivity_matrix(edges)

mat
```

A better way to visualize any kind of matrices, is to call the function `gg_matrix()`.



```{r 'gg-matrix', echo=TRUE, dpi=150, fig.height=6, fig.width=6}
# Visualize matrix ----
gg_matrix(mat)
```


## Mapping edges

Now, let's go back into a spatial world. First let's convert our sampling into
an [`sf`](https://r-spatial.github.io/sf/) object.


```{r 'convert-to-sf', echo=TRUE}
# Convert sampling to sf object ----
nodes_sf <- sf::st_as_sf(nodes, 
                         coords = c("longitude", "latitude"),
                         crs = "epsg:2154")

nodes_sf
```

To convert our edge list into a spatial object, we can use the function `edges_to_sf()`.



```{r 'edges-to-sf', echo=TRUE}
# Convert edges to sf object ----
edges_sf <- edges_to_sf(edges, nodes_sf)

edges_sf
```

The result is a collection of `LINESTRINGS`, i.e. a collection of spatial lines where
each line is an edge defined in the coordinate system (CRS) of the sampling.

Let's use `ggplot2` and `sf` to map the nodes and the edges.


```{r 'mapping-edges', echo=TRUE, dpi = 150, fig.height=8, fig.width=6.5}
# Map of nodes and edges ----
ggplot() +
  geom_sf(data = edges_sf) +
  geom_sf(data = nodes_sf, size = 12) +
  theme_light()
```

Finally, let's add the node labels on this map.

```{r 'mapping-edges-labels', echo=TRUE, dpi = 150, fig.height=8, fig.width=6.5}
# Map of nodes and edges ----
ggplot() +
  geom_sf(data = edges_sf) +
  geom_sf(data = nodes_sf, size = 12) +
  geom_sf_text(data = nodes_sf, aes(label = node), 
               color = "white", fontface = "bold",
               family = "mono") +
  theme_light()
```
