---
title: "Wizualizacja danych przestrzennych z pakietem ggplot2"
subtitle: "Statystyczne i graficzne podstawy geowizualizacji"
author: Anna Dmowska, dmowska@amu.edu.pl
format:
  html: 
    theme: cosmo
    toc: true
    toc-location: left
    toc-title: "Spis treści"
    number-sections: true
editor: visual
---

## Wizualizacja danych przestrzennych w R

R jest językiem programowania oraz środowiskiem obliczeniowym pozwalającym na analizę statystyczną danych oraz wizualizację danych. R dostarcza także wielu funkcji do pracy z danymi przestrzennymi. Poniżej przedstawione zostały podstawowe informacje dotyczące wizualizacji danych przestrzennych z wykorzystaniem pakietu `ggplot2`

Dodatkowe informacje:

-   Praca z danymi przestrzennymi w R: <https://r.geocompx.org/>

-   Wizualizacja danych przestrzennych z wykorzystaniem pakietu `ggplot2`: <https://ggplot2-book.org/maps.html>

-   Wizualizacja danych przestrzennych z wykorzystaniem pakietu `tmap`:

    -   <https://r-tmap.github.io/tmap/>
    -   <https://r-graph-gallery.com/package/tmap.html>
    -   <https://tmap.geocompx.org/>

```{r}
#| message: false
library(tidyverse)
```

## Dane przestrzenne w R

Dane wektorowe można wczytać do R wykorzystując funkcję `read_sf()` z pakietu `sf`.

```{r}
library(sf)
```

```{r}
granice = read_sf("dane/world.gpkg")
```

Plik ***world.gpkg*** zawiera granice państw/terytoriów na świecie. Plik ten składa się z 10 kolumn zawierających następujące informacje:

-   ***TYPE*** - typ terytorium: niezależne, zależne\
-   ***NAME*** - nazwa państwa/terytorium
-   ***ECONOMY*** - klasa, określająca rozwój gospodarki
-   ***INCOME_GRP*** - klasa dochodów
-   ***ISO_A3*** - 3-literowy skrót nazwy państwa
-   ***CONTINENT*** - kontynent
-   ***REGION_UN*** - region wg klasyfikacji ONZ
-   ***SUBREGION*** - region
-   ***REGION_WB*** - region wg klasyfikacji Banku Światowego
-   ***geom*** - kolumna z zapisaną "geometrią", określająca typ danych wektorowych.

```{r}
head(granice)
```

```{r}
plot(granice)
```

## Wizualizacja danych z pakietem `ggplot2`

Dane wektorowe wczytane za pomocą funkcji `read_sf` z pakietu `sf` można zwizualizować wykorzystując `geom_sf()`.

```{r}
library(ggplot2)
```

```{r}
ggplot(granice, aes(fill = REGION_WB)) +
  geom_sf()
```

Do zmiany palety kolorów można użyć np. `scale_fill_brewer()` lub innej funkcji stosowanej także w przypadku wykresów.

```{r}
ggplot(granice, aes(fill = REGION_WB)) +
  geom_sf() + 
  scale_fill_brewer(palette = "Dark2")
```

```{r}
ggplot(granice, aes(fill = REGION_WB)) +
  geom_sf() + 
  scale_fill_manual(name = "Region",
                    values = c("Sub-Saharan Africa" = "orange",
                                "Middle East & North Africa" = "red",
                                "East Asia & Pacific" = "lightgreen",
                                "Latin America & Caribbean" = "blue",
                                "Europe & Central Asia" = "darkgreen", 
                                "North America" = "lightblue",            
                                "Antarctica" = "grey",
                                "South Asia" = "green")) + 
  theme_bw()
```

Używając `xlim()` oraz `ylim()` można ograniczyć zakres wyświetlania.

```{r}
ggplot(granice, aes(fill = REGION_WB)) +
  geom_sf() + 
  xlim(-20, 60) + ylim(-40, 50) + 
  scale_fill_manual(name = "Region",
                    values = c("Sub-Saharan Africa" = "orange",
                                "Middle East & North Africa" = "red",
                                "East Asia & Pacific" = "lightgreen",
                                "Latin America & Caribbean" = "blue",
                                "Europe & Central Asia" = "darkgreen", 
                                "North America" = "lightblue",            
                                "Antarctica" = "grey",
                                "South Asia" = "green")) + 
  theme_bw()
```

Funkcja `facet_wrap()` pozwala na wykonanie ilustracji w postaci kilku panelów.

```{r}
ggplot(granice, aes(fill = REGION_WB)) +
  geom_sf() + 
  scale_fill_brewer(palette = "Dark2") + 
  facet_wrap(~CONTINENT) + 
  theme_bw()
```

W przypadku danych wektorowych można także dokonywać selekcji na podstawie tabeli atrybutów wykorzystując funkcje z pakietu `dpyr`.

```{r}
azja = granice |> 
  filter(CONTINENT == 'Asia')
```

```{r}
ggplot(azja) +
  geom_sf(aes(fill = REGION_WB)) + 
  scale_fill_brewer(palette = "Dark2") + 
  geom_sf_label(aes(label = NAME))
```

Proszę zwrócić uwagę, na zastosowanie *aes(fill = REGION_WB)* wewnątrz funkcji *ggplot()*, *geom_sf()* oraz *geom_sf_label()*.

```{r}
ggplot(azja, aes(fill = REGION_WB)) +
  geom_sf() + 
  scale_fill_brewer(palette = "Dark2") + 
  geom_sf_label(aes(label = NAME))
```

```{r}
ggplot(azja) +
  geom_sf() + 
  scale_fill_brewer(palette = "Dark2") + 
  geom_sf_label(aes(fill = REGION_WB, label = NAME))
```

Etykiety można także dodać tylko do wybranego podzbioru danych. W poniższym przykładzie podpisane zostaną tylko państwa o niskim poziomie dochodów.

```{r}
ggplot(azja) +
  geom_sf(aes(fill = REGION_WB)) + 
  scale_fill_brewer(palette = "Dark2") + 
  geom_sf_label(data=filter(azja, INCOME_GRP == "5. Low income"), aes(label = NAME)) + 
  theme_bw()

```

### Łączenie danych przestrzennych i danych atrybutowych

Plik ***dane/wdi.csv*** zawiera dodatkowe informacje dotyczące państwdla lat 1990 i 2020:

-   GDP1990, GDP2020 - PKB na osobę w USD.
-   POP1990, POP2020 - liczba ludności
-   RPOP1990, RPOP2020 - liczba ludności zamieszkałej w obszarach wiejskich
-   UPOP1990, UPOP2020 - liczba ludności zamieszkałej w obszarach miejskich
-   LE1990, LE2020 - oczekiwana długość trwania życia
-   INCOME1990, INCOME2020 - grupa dochodów

```{r}
dane = read.csv("dane/wdi.csv")
```

```{r}
head(dane)
```

Dane z pliku ***dane/wdi.csv*** można dołączyć do pliku zawierającego granice państw używając funkcji `left_join()` z pakietu `dplyr` używając 3 literowego skrótu nazwy państwa (kolumna *Code* w pliku wdi.csv oraz *ISO_A3* w pliku granice.gpkg).

```{r}
dane_attr = left_join(x = granice, y = dane, by = join_by(ISO_A3 == Code))
```

```{r}
library(colorspace)
ggplot(dane_attr, aes(fill = POP2020)) +
  geom_sf() + 
  scale_fill_continuous_sequential(trans = "log10", labels = scales::label_comma(), palette = "YlOrRd") + 
  theme_bw()
```

> Wykonaj mapy pokazujące rozkład klas INCOME1990 oraz INCOME2020. Zmodyfikuj kolory przypisane poszczególnym klasom, dodaj tytuł do mapy.

## Zadanie samodzielne

1.  Używając funkcji `read_sf()` wczytaj plik *world.gpkg*
2.  Wczytaj dane z pliku *wdi_1990_2020.csv*
3.  Używając funkcji `left_join()` dołącz informacje z pliku *wdi_1990_2020.csv* do granic państw.
4.  Wykorzystaj funkcję `facet_wrap()` do przedstawienia liczby ludności zamieszkujące obszary miejskie (UPOP) w 1990 i 2020 roku. Zmień paletę kolorów na mapach.
5.  Wykorzystaj funkcję `facet_wrap()` do przedstawienia klas dochodów (INCOME) w 1990 i 2020 roku. Zmień paletę kolorów na mapach.


