Skip to content

Commit

Permalink
Tilføj kode til side
Browse files Browse the repository at this point in the history
  • Loading branch information
aleksanderbl29 committed Jun 29, 2024
1 parent dcfcd00 commit 96a5dbd
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"hash": "296946762f60771b3c991bf4b5ba6b30",
"hash": "32cf90218f9dc1d39f1281c03b5ead51",
"result": {
"engine": "knitr",
"markdown": "---\ntitle: Nemt Danmarkskort i R\ncitation:\n url: https://aleksanderbl.dk/guides/2024-05-19-danmarkskort-i-r\nbibliography: refs.bib\nexecute: \n echo: true\n output: false\n cache: true\nlink-external-icon: true\nlink-external-newwindow: true\nother-links:\n - text: Samlet script\n icon: code\n href: https://github.com/aleksanderbl29/aleksanderbldk/blob/main/guides/2024-06-29-danmarkskort-i-r/kort.r\n - text: Mikkel Krogsholms guide\n href: https://www.linkedin.com/pulse/easy-maps-denmark-r-mikkel-freltoft-krogsholm/ \nfig-cap-location: margin\ndate: 2024-06-29\n---\n\n\n## Baggrund\n\nDa jeg skulle lære at lave kort i R, lavede jeg et par hurtige googlesøgninger, hvor jeg kom frem til en god guide lavet af Mikkel Freltoft @krogsholm2021. Jeg opdagede dog hurtigt, at guiden er out-of-date - og derfor skriver jeg denne guide.\n\nI denne guide vil jeg gennemgå hvordan man kan skabe et kort over alle afstemningssteders områder i Danmark. Vi vil både producere et kort for Aarhus Kommune (@fig-aarhus) og et kort for alle afstemningsområder i hele Danmark (@fig-dk).\n\n## Pakker\n\nI R-universet findes der flere pakker til at arbejde med kort. Jeg har valgt at bruge `sf`som den pakke jeg sætter mig ind i, hvad kan. De fleste kan grundlæggende det samme og er bygget op omkring `geometry`, der er den kolonne (eller variabel) i en dataframe, der indeholder figurerne til kortet.\n\nFørst indlæser vi alle pakker der skal bruges.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse) # Her får vi %>%, ggplot2 og andre smarte funktioner.\nlibrary(sf) # Skal bruges til at arbejde med \"simple features\" (figurer).\n```\n:::\n\n::: {.cell}\n\n:::\n\n\n\n## Data\n\nFor at tegne et præcist danmarkskort kan vi hente `geojson` data fra @apidawa2024. De udstiller en udmærket `API` der kan levere kortdata til os. For at vi kan benytte en `API` i `R` skal vi først definere et `URL` og dernæst bede om at downloade den fil der hører til på den hjemmeside.\n\n\n1. Først definerer vi `API`ens `URL`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Gemmer URL til API-kald\nurl <- \"https://api.dataforsyningen.dk/afstemningsomraader?format=geojson\"\n```\n:::\n\n\n::: {.aside}\nDu behøver *ikke* at vide hvad en `API` er for at kunne gennemføre denne guide.\n:::\n\n2. Dernæst beder vi `R` om at downloade den efterspurgte fil til en midlertidig placering i computerens hukommelse.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Skaber midlertidig fil\ngeofile <- tempfile()\n\n# Henter geojson til tempfile\ndownload.file(url, geofile)\n```\n:::\n\n\nVi bruger funktionen `download.file()` og giver den `API`ens `URL` og den midlertidige dataplacering, hvor vi ønsker dataene hentet til.\n\n3. Til sidst omformer vi `geoJSON` til et `sf` format som `R` kan forstå.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Læser datafilen ind i R\ngeodata_st <- st_read(geofile)\nafstemningssteder_geodata <- st_as_sf(geodata_st)\n```\n:::\n\n\n::: {.aside}\nHer omformes først til `st` og dernæst til `sf`.\n:::\n\nNu har vi en dataframe i `afstemningssteder_geodata` der indeholder de figurer vi skal bruge for at lave et danmarkskort!\n\n### Optimering af data\n\nFor at vi nemt kan rendere vores plots er det en god ide at gøre figurerne en smule mindre. *Især* når vi er helt nede på afstemningsstedsniveau. Det er nok ikke så relevant, hvis vi arbejder med kommuner eller landsdele.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nafstemningssteder_geodata <- rmapshaper::ms_simplify(afstemningssteder_geodata,\n keep = 0.01, keep_shapes = TRUE)\n```\n:::\n\n\n::: {.aside}\nHer indlæser vi `rmapshaper::ms_simplify()` med pakkens navn for at slippe for at indlæse hele pakken - Vi skal nemlig ikke bruge det hele! Det samme har vi gjort med `ggthemes::theme_map()` nedenfor, fordi der kun skal bruges det ene *theme*\n:::\n\n## Visualisering\n\nNu kommer vi til den sjove del - At lave selve kortet! Vi skal bruge `ggplot2` fra det velkendte *tidyverse*, præcis som når vi laver grafer i mange andre sammenhænge.\n\nVi bruger `geom_sf`, der er indbygget i `ggplot2` til at tegne de figurer der er opbevaret i vores dataframe. Jeg putter derudover også `ggthemes::theme_map()` på, fordi jeg ikke synes kort behøver akselinjer og en baggrund. `theme_map()` er mit klart foretrukne tema til kort.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nggplot(afstemningssteder_geodata) +\n geom_sf() +\n ggthemes::theme_map() +\n labs(title = \"Afstemningssteder i Danmark\",\n caption = \"Kilde: DAWA/DAGI\") +\n theme(legend.position = \"none\",\n plot.title = element_text(size = 20),\n plot.caption = element_text(size = 10))\n```\n\n::: {.cell-output-display}\n![Kort over alle afstemningsområder i hele Danmark. Kilde og titel tilføjet.](index_files/figure-html/fig-dk-1.png){#fig-dk width=672}\n:::\n:::\n\n\n### Visualisering af udsnit\n\nFor at kun vise de afstemningsområder der ligger i Aarhus Kommune kan vi benytte os af `filter()` funktionen fra `dplyr` pakken. Med den kan vi filtrere i vores dataframe, så der kun vises afstemningssteder, hvor kommunenavnet er \"Aarhus\". Derudover har jeg tilføjet et `fill` på afstemningsområdets navn for at give hver område sin egen farve.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nafstemningssteder_geodata %>%\n filter(kommunenavn == \"Aarhus\") %>%\n ggplot(aes(fill = navn)) +\n geom_sf() +\n ggthemes::theme_map() +\n theme(legend.position = \"none\")\n```\n\n::: {.cell-output-display}\n![Kort over alle afstemningsområder i Aarhus Kommune.](index_files/figure-html/fig-aarhus-1.png){#fig-aarhus width=672}\n:::\n:::\n\n\n## Samlet kode\n\nAlt hvad jeg har gennemgået i denne guide kan findes i et samlet `r`-script [på min github](https://github.com/aleksanderbl29/aleksanderbldk/blob/main/guides/2024-06-29-danmarkskort-i-r/kort.r).\n\n\n::: {.cell}\n\n:::\n",
"markdown": "---\ntitle: Nemt Danmarkskort i R\ncitation:\n url: https://aleksanderbl.dk/guides/2024-05-19-danmarkskort-i-r\nbibliography: refs.bib\nexecute: \n echo: true\n output: false\n cache: true\nlink-external-icon: true\nlink-external-newwindow: true\nother-links:\n - text: Samlet script\n icon: code\n href: https://github.com/aleksanderbl29/aleksanderbldk/blob/main/guides/2024-06-29-danmarkskort-i-r/kort.r\n - text: Mikkel Krogsholms guide\n href: https://www.linkedin.com/pulse/easy-maps-denmark-r-mikkel-freltoft-krogsholm/ \nfig-cap-location: margin\ndate: 2024-06-29\n---\n\n\n## Baggrund\n\nDa jeg skulle lære at lave kort i R, lavede jeg et par hurtige googlesøgninger, hvor jeg kom frem til en god guide lavet af Mikkel Freltoft @krogsholm2021. Jeg opdagede dog hurtigt, at guiden er out-of-date - og derfor skriver jeg denne guide.\n\nI denne guide vil jeg gennemgå hvordan man kan skabe et kort over alle afstemningssteders områder i Danmark. Vi vil både producere et kort for Aarhus Kommune (@fig-aarhus) og et kort for alle afstemningsområder i hele Danmark (@fig-dk).\n\n## Pakker\n\nI R-universet findes der flere pakker til at arbejde med kort. Jeg har valgt at bruge `sf`som den pakke jeg sætter mig ind i, hvad kan. De fleste kan grundlæggende det samme og er bygget op omkring `geometry`, der er den kolonne (eller variabel) i en dataframe, der indeholder figurerne til kortet.\n\nFørst indlæser vi alle pakker der skal bruges.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse) # Her får vi %>%, ggplot2 og andre smarte funktioner.\nlibrary(sf) # Skal bruges til at arbejde med \"simple features\" (figurer).\n```\n:::\n\n::: {.cell}\n\n:::\n\n\n\n## Data\n\nFor at tegne et præcist danmarkskort kan vi hente `geojson` data fra @apidawa2024. De udstiller en udmærket `API` der kan levere kortdata til os. For at vi kan benytte en `API` i `R` skal vi først definere et `URL` og dernæst bede om at downloade den fil der hører til på den hjemmeside.\n\n\n1. Først definerer vi `API`ens `URL`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Gemmer URL til API-kald\nurl <- \"https://api.dataforsyningen.dk/afstemningsomraader?format=geojson\"\n```\n:::\n\n\n::: {.aside}\nDu behøver *ikke* at vide hvad en `API` er for at kunne gennemføre denne guide.\n:::\n\n2. Dernæst beder vi `R` om at downloade den efterspurgte fil til en midlertidig placering i computerens hukommelse.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Skaber midlertidig fil\ngeofile <- tempfile()\n\n# Henter geojson til tempfile\ndownload.file(url, geofile)\n```\n:::\n\n\nVi bruger funktionen `download.file()` og giver den `API`ens `URL` og den midlertidige dataplacering, hvor vi ønsker dataene hentet til.\n\n3. Til sidst omformer vi `geoJSON` til et `sf` format som `R` kan forstå.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Læser datafilen ind i R\ngeodata_st <- st_read(geofile)\nafstemningssteder_geodata <- st_as_sf(geodata_st)\n```\n:::\n\n\n::: {.aside}\nHer omformes først til `st` og dernæst til `sf`.\n:::\n\nNu har vi en dataframe i `afstemningssteder_geodata` der indeholder de figurer vi skal bruge for at lave et danmarkskort!\n\n### Optimering af data\n\nFor at vi nemt kan rendere vores plots er det en god ide at gøre figurerne en smule mindre. *Især* når vi er helt nede på afstemningsstedsniveau. Det er nok ikke så relevant, hvis vi arbejder med kommuner eller landsdele.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nafstemningssteder_geodata <- rmapshaper::ms_simplify(afstemningssteder_geodata,\n keep = 0.01, keep_shapes = TRUE)\n```\n:::\n\n\n::: {.aside}\nHer indlæser vi `rmapshaper::ms_simplify()` med pakkens navn for at slippe for at indlæse hele pakken - Vi skal nemlig ikke bruge det hele! Det samme har vi gjort med `ggthemes::theme_map()` nedenfor, fordi der kun skal bruges det ene *theme*\n:::\n\n## Visualisering\n\nNu kommer vi til den sjove del - At lave selve kortet! Vi skal bruge `ggplot2` fra det velkendte *tidyverse*, præcis som når vi laver grafer i mange andre sammenhænge.\n\nVi bruger `geom_sf`, der er indbygget i `ggplot2` til at tegne de figurer der er opbevaret i vores dataframe. Jeg putter derudover også `ggthemes::theme_map()` på, fordi jeg ikke synes kort behøver akselinjer og en baggrund. `theme_map()` er mit klart foretrukne tema til kort.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nggplot(afstemningssteder_geodata) +\n geom_sf() +\n ggthemes::theme_map() +\n labs(title = \"Afstemningssteder i Danmark\",\n caption = \"Kilde: DAWA/DAGI\") +\n theme(legend.position = \"none\",\n plot.title = element_text(size = 20),\n plot.caption = element_text(size = 10))\n```\n\n::: {.cell-output-display}\n![Kort over alle afstemningsområder i hele Danmark. Kilde og titel tilføjet.](index_files/figure-html/fig-dk-1.png){#fig-dk width=672}\n:::\n:::\n\n\n### Visualisering af udsnit\n\nFor at kun vise de afstemningsområder der ligger i Aarhus Kommune kan vi benytte os af `filter()` funktionen fra `dplyr` pakken. Med den kan vi filtrere i vores dataframe, så der kun vises afstemningssteder, hvor kommunenavnet er \"Aarhus\". Derudover har jeg tilføjet et `fill` på afstemningsområdets navn for at give hver område sin egen farve.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nafstemningssteder_geodata %>%\n filter(kommunenavn == \"Aarhus\") %>%\n ggplot(aes(fill = navn)) +\n geom_sf() +\n ggthemes::theme_map() +\n theme(legend.position = \"none\")\n```\n\n::: {.cell-output-display}\n![Kort over alle afstemningsområder i Aarhus Kommune.](index_files/figure-html/fig-aarhus-1.png){#fig-aarhus width=672}\n:::\n:::\n\n\n## Samlet kode\n\nAlt hvad jeg har gennemgået i denne guide kan findes i et samlet `r`-script [på min github](https://github.com/aleksanderbl29/aleksanderbldk/blob/main/guides/2024-06-29-danmarkskort-i-r/kort.r). Den kan også findes [her på hjemmesiden](kort-kode.qmd).\n\n\n::: {.cell}\n\n:::\n",
"supporting": [],
"filters": [
"rmarkdown/pagebreak.lua"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"hash": "512a13b1e0a82632ab8ddd38edf16a19",
"result": {
"engine": "knitr",
"markdown": "---\ntitle: Samlet kode til danmarkskort\nexecute: \n echo: true\n eval: false\nlink-external-icon: true\nlink-external-newwindow: true\nother-links:\n - text: Samlet script\n icon: code\n href: https://github.com/aleksanderbl29/aleksanderbldk/blob/main/guides/2024-06-29-danmarkskort-i-r/kort.r\ndraft: true\n# date: 2024-06-29\nauthor: \"\"\n---\n\n\nHerunder er den samlede kode fra [guiden til at lave et nemt danmarkskort](index.qmd).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse) # Her får vi %>%, ggplot2 og andre smarte funktioner.\nlibrary(sf) # Skal bruges til at arbejde med \"simple features\" (figurer).\n\n## Gemmer URL til API-kald\nurl <- \"https://api.dataforsyningen.dk/afstemningsomraader?format=geojson\"\n\n# Sætter timeout til 10 minutter, fordi afstemingsstederne kan tage lang tid om at hente\noptions(timeout = 600)\n\n# Skaber midlertidig fil\ngeofile <- tempfile()\n\n# Henter geojson til tempfile\ndownload.file(url, geofile)\n\n# Læser datafilen ind i R\ngeodata_st <- st_read(geofile)\nafstemningssteder_geodata <- st_as_sf(geodata_st)\n\n# Simplificerer geodata\nafstemningssteder_geodata <- rmapshaper::ms_simplify(afstemningssteder_geodata,\n keep = 0.01,\n keep_shapes = TRUE)\n\n# Skaber danmarkskort\ndanmarkskort <- ggplot(afstemningssteder_geodata) +\n geom_sf() +\n ggthemes::theme_map() +\n labs(title = \"Afstemningssteder i Danmark\",\n caption = \"Kilde: DAWA/DAGI\") +\n theme(legend.position = \"none\",\n plot.title = element_text(size = 20),\n plot.caption = element_text(size = 10))\n\n# Skaber kort over steder i Aarhus\naarhus_kort <- afstemningssteder_geodata %>%\n filter(kommunenavn == \"Aarhus\") %>%\n ggplot(aes(fill = navn)) +\n geom_sf() +\n ggthemes::theme_map() +\n theme(legend.position = \"none\")\n\ndanmarkskort\n\naarhus_kort\n\n# Sætter timout tilbage til 1 minut\noptions(timeout = 60)\n```\n:::\n",
"supporting": [],
"filters": [
"rmarkdown/pagebreak.lua"
],
"includes": {},
"engineDependencies": {},
"preserve": {},
"postProcess": true
}
}
2 changes: 1 addition & 1 deletion guides/2024-06-29-danmarkskort-i-r/index.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ afstemningssteder_geodata %>%

## Samlet kode

Alt hvad jeg har gennemgået i denne guide kan findes i et samlet `r`-script [på min github](https://github.com/aleksanderbl29/aleksanderbldk/blob/main/guides/2024-06-29-danmarkskort-i-r/kort.r).
Alt hvad jeg har gennemgået i denne guide kan findes i et samlet `r`-script [på min github](https://github.com/aleksanderbl29/aleksanderbldk/blob/main/guides/2024-06-29-danmarkskort-i-r/kort.r). Den kan også findes [her på hjemmesiden](kort-kode.qmd).

```{r}
#| echo: false
Expand Down
69 changes: 69 additions & 0 deletions guides/2024-06-29-danmarkskort-i-r/kort-kode.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
---
title: Samlet kode til danmarkskort
execute:
echo: true
eval: false
link-external-icon: true
link-external-newwindow: true
other-links:
- text: Samlet script
icon: code
href: https://github.com/aleksanderbl29/aleksanderbldk/blob/main/guides/2024-06-29-danmarkskort-i-r/kort.r
draft: true
# date: 2024-06-29
author: ""
---

Herunder er den samlede kode fra [guiden til at lave et nemt danmarkskort](index.qmd).

```{r}
library(tidyverse) # Her får vi %>%, ggplot2 og andre smarte funktioner.
library(sf) # Skal bruges til at arbejde med "simple features" (figurer).
## Gemmer URL til API-kald
url <- "https://api.dataforsyningen.dk/afstemningsomraader?format=geojson"
# Sætter timeout til 10 minutter, fordi afstemingsstederne kan tage lang tid om at hente
options(timeout = 600)
# Skaber midlertidig fil
geofile <- tempfile()
# Henter geojson til tempfile
download.file(url, geofile)
# Læser datafilen ind i R
geodata_st <- st_read(geofile)
afstemningssteder_geodata <- st_as_sf(geodata_st)
# Simplificerer geodata
afstemningssteder_geodata <- rmapshaper::ms_simplify(afstemningssteder_geodata,
keep = 0.01,
keep_shapes = TRUE)
# Skaber danmarkskort
danmarkskort <- ggplot(afstemningssteder_geodata) +
geom_sf() +
ggthemes::theme_map() +
labs(title = "Afstemningssteder i Danmark",
caption = "Kilde: DAWA/DAGI") +
theme(legend.position = "none",
plot.title = element_text(size = 20),
plot.caption = element_text(size = 10))
# Skaber kort over steder i Aarhus
aarhus_kort <- afstemningssteder_geodata %>%
filter(kommunenavn == "Aarhus") %>%
ggplot(aes(fill = navn)) +
geom_sf() +
ggthemes::theme_map() +
theme(legend.position = "none")
danmarkskort
aarhus_kort
# Sætter timout tilbage til 1 minut
options(timeout = 60)
```

0 comments on commit 96a5dbd

Please sign in to comment.