Kommunerna där kvinnor styr

Sen jag var en kiddo har jag varit besatt av kartor. Historiska kartor, moderna kartor eller påhittade kartor, spelar ingen roll. Därför är det extra kul att på ett enkelt sätt kunna göra kartor i R. Så här tänkte jag visa hur man enkelt kan göra kartor på kommunnivå över Sverige.

För att göra något intressant tänkte jag undersöka andelen kvinnor på förtroendevalda ordförandeposter i svenskar kommuner, exempelvis ordförande i kommunstyrelsen.

Är du inte intresserad av all kod och det tekniska kan du bara klicka här.

Som det tack och lov ofta är i R har någon gjort det mesta av arbetet. I det här fallet är det Thomas Reinholdsson som skrivit paketet swemaps som innehåller data från SCB för att kunna göra kartor över Sverige. Det finns att ladda ner på github.

devtools::install_github('reinholdsson/swemaps')

swemaps har fyra olika data-set med kartinformation som man kan använda med ggplot2 och leaflet.

map_ln: polygon data över Sveriges länregions polygon data map_kn: polygon data över Sveriges kommuner cent_ln: centroid data län cent_kn: centroid data kommuner

ggplot2 är det mest populära paketet för visualiseringar i R och leaflet är ett paket för att skapa interaktiva kartor likt google maps.

Här skapar vi en enkel karta över Sverige.

library(swemaps)
library(ggplot2)

ggplot(map_kn, aes_string('ggplot_long', 'ggplot_lat', group = 'knkod')) +
  geom_polygon() +
  coord_equal()

Men eftersom ggplot används för alla möjliga olika sorters grafer måste vi modifiera den lite för att göra kartor. Y och X axel samt gridlines blir i sammanhanget överflödiga.

Följande modifikationer kommer från Timo Grossenbacher som skrivit mycket om kartor i R.

theme_map <- function(...) {
  theme_minimal() +
  theme(
    text = element_text(family = "Helvetica", color = "#22211d"),
    axis.line = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    # panel.grid.minor = element_line(color = "#ebebe5", size = 0.2),
    panel.grid.major = element_line(color = "#ebebe5", size = 0.2),
    panel.grid.minor = element_blank(),
    plot.background = element_rect(fill = "#f5f5f2", color = NA), 
    panel.background = element_rect(fill = "#f5f5f2", color = NA), 
    legend.background = element_rect(fill = "#f5f5f2", color = NA),
    panel.border = element_blank(),
    ...
  )
}

Tada! Nu blir kartan mer tilltalande.

ggplot(map_kn, aes_string('ggplot_long', 'ggplot_lat', group = 'knkod')) +
  geom_polygon() +
  coord_equal() +
  labs(title = "Karta över Sverige") +
  theme_map()

Men den här kartan är fortfarande inte så mycket att ha. Vi måste fylla den med något.

För det använder vi ett annat paket Reinholdsson har byggt. Det är en API-klient till Kolada som är en hemsida för kommunal statistik.

I det här fallet är jag intresserad av kommuners förtroendevalda och hur stor andel av kommunens ordförande som är kvinnor.

Paketet rkolada är förvisso ganska gammalt och inte interaktivt som exempelvis pxweb men det gör jobbet.

Vi börjar med att ladda ner det från Github.

devtools::install_github('reinholdsson/rkolada')

För att använda paketet rekommenderar jag att man går in på Koladas hemsida, hittar statistiken man är intresserad av och längst ner på sidan för statistiken hittar id.numret för den statistiken.

Nu använder vi funktionen rkolada() för att skapa ett objekt med information om koladas API. Men eftersom vi redan har id.numret för statistiken vi är intresserade över hoppar jag över några steg. Men vill man läsa mer finns det en tutorial på Reinholdssons Gitbhub.

library(dplyr)
library(rkolada)

a <- rkolada()

data_2017 <- a$values(c('N05816')) %>%
  filter(period == 2017, municipality.id != "0000")

Så först skapade jag ett objekt a med information om Koladas API. Sedan berättade jag via a$values(c('N05816')) att jag vill ha alla värden för tabellen 'N05816'. Eftersom jag endast är intresserad av år 2017 och inte vill ha med värde för riket (0000) så filtrerar jag med dplyr.

Nu har jag 290 observationer. Men jag behöver slå ihop dessa med data för kartobjekten. Det gör vi med left_join.

map_kn_join <- left_join(map_kn, data_2017, by = c("knkod" = "municipality.id")) %>%
  rename("% Kvinnor ordförande" = value)

Nu kan vi fylla kartorna med fill. Jag använder paketet virids för en lite snyggare färgskala (“magma”) som enligt mig är enklare att tolka än ggplot2:s default.

library(viridis)
library(plotly)
p <- ggplot(map_kn_join, aes(x = ggplot_long,
                             y = ggplot_lat,
                          group = knnamn,
                          fill = round(`% Kvinnor ordförande`, 1))) +
  geom_polygon() +
  coord_equal() +
  labs(title = "Här styr kvinnorna") +
  theme_map() +
  scale_fill_viridis(option="magma",
                     guide = guide_legend(
                     title = "% kvinnor på\nordförande-\nposter"),
                     discrete = FALSE,
                     begin = 0, end = 1)

p

Vill vi se vilka de här kommunerna är kan vi helt enkelt använda ggplotly() från paketet plotly som är ett paket för interaktiva grafer i r.

Av någon anledning försvinner vår legend (% kvinnor på…). Men det blir mycket enklare att navigera på kartan.

ggplotly(p)
Dela Kommentarer
comments powered by Disqus