Gå till index

Analys med R

0% färdig
0/0 Steps
  1. Analys och forskning med R och Posit (Rstudio)
  2. Grunderna i R och Rstudio
    7 Ämnen
  3. Importera, exportera, spara och ladda data
    5 Ämnen
  4. Strängar och regular expressions (regex)
    1 Ämne
  5. Bearbetning av data med dplyr
    12 Ämnen
  6. Visualisera och presentera
    14 Ämnen
  7. Explorerande analyser
    6 Ämnen
  8. Prediktionsmodeller
    12 Ämnen
  9. Klassisk regressionsanalys
    8 Ämnen
  10. Machine learning (ML) och Artificiell Intelligens (AI)
    9 Ämnen
  11. Prediktionsmodeller: Tidymodels
  12. Hypotestester
    1 Ämne
Avsnitt 6, Ämne 3
Startad

Grunderna i ggplot2

Avsnitt Progress
0% färdig

Övningsdata

I detta kapitel använder vi data från gapminder. Gapminder grundades i Stockholm år 2005 och samlar global statistik om bland annat hälsa, ekonomisk utveckling och populationsutveckling. Du kan få åtkomst till data från Gapminder med följande kommandon:

R
install.packages("gapminder")
library(gapminder)
gapminder

I Gapminder finns variablerna country, continent, year, lifeExp (livslängd), pop (populationsmängd) och gdpPercap (GDP per capita). Dessa data är våra övningsdata.

countrycontinentyearlifeExppopgdpPercap
AfghanistanAsia195228.801008425333779.4453
AfghanistanAsia195730.332009240934820.8530
AfghanistanAsia196231.9970010267083853.1007
AfghanistanAsia196734.0200011537966836.1971
AfghanistanAsia197236.0880013079460739.9811
AfghanistanAsia197738.4380014880372786.1134
AfghanistanAsia198239.8540012881816978.0114
AfghanistanAsia198740.8220013867957852.3959
AfghanistanAsia199241.6740016317921649.3414
AfghanistanAsia199741.7630022227415635.3414
AfghanistanAsia200242.1290025268405726.7341
AfghanistanAsia200743.8280031889923974.5803
AlbaniaEurope195255.2300012826971601.0561
AlbaniaEurope195759.2800014765051942.2842
AlbaniaEurope196264.8200017281372312.8890
AlbaniaEurope196766.2200019840602760.1969
AlbaniaEurope197267.6900022635543313.4222
AlbaniaEurope197768.9300025090483533.0039
AlbaniaEurope198270.4200027800973630.8807
AlbaniaEurope198772.0000030753213738.9327
AlbaniaEurope199271.5810033264982497.4379
AlbaniaEurope199772.9500034280383193.0546
AlbaniaEurope200275.6510035085124604.2117
AlbaniaEurope200776.4230036005235937.0295

Paketet ggplot2 har en övergripande funktion: ggplot(). Vi börjar med att skriva ggplot() och ange argumentet data. När den koden körs erhåller vi följande figur.

R
ggplot(data=gapminder)

Ovan ser vi bara en tom grå rektangel, vilket beror på att grafen saknar två komponenter:

  1. Estetisk mappning: aes()
  2. Geometriska komponenter: geom()

Vi fortsätter genom att lägga till aes(), där vi anger att x är year och y är pop. Resultatet är fortsatt en tom graf men nu med x-axel och y-axel specificerad:

R
ggplot(data=gapminder,
       aes(x=year,
           y=pop))

Grafen är tom eftersom den saknar geom(), vilket definierar geometriska komponenter. Vi lägger till geom_points() som specificerar att vi vill se punkter på grafen:

R
ggplot(data=gapminder,
       aes(x=year,
           y=pop)) +
  geom_point()

Det betyder att man i ggplot() specificerar en datakälla, estetiska mappning (aes()) med bland annat x-axel och y-axel, och därefter adderar lager med geometriska komponenter (exempelvis geom_point()). Således har geom_point() ärvt den estetiska mappningen från ggplot()!

Labels (etiketter)

Etiketter förtydligar grafens innehåll. Den engelska termen är labels, som hädanefter också används här. Labels anges med funktionen labs(). Du kan ange labels för x-axel, y-axel, titel, subtitel, figurförklaring, osv. Exempel följer:

R
ggplot(data=gapminder,
       aes(x=year,
           y=pop)) +
  geom_point() +
  labs(x="Year",
       y="Population",
       tag="A",
       title="Titeln på grafen",
       subtitle="Undertiteln på grafen",
       caption="Figurförklaring hamnar här.")

Det börjar bli ett par rader kod nu. För att det skall vara tydligt vad som är nytt i varje kodruta kommer det hädanefter markeras med kommentaren #NYTT.

Inaktivera Scientific notation

Notera y-axeln på föregående graf. Värdena är presenterade med scientific notation, vilket aktiveras på väldigt stora eller väldigt små tal. Du kan inaktivera detta med kommandot:

options(scipen=999)

Som nämnt ovan ärver geom_point() den estetiska mappningen (aes()) av ggplot(). Vi kan dock åsidosätta denna mappningen genom att ange aes() i geom_point(). Då kommer geom_point() inte ärva mappningen. Följande graf är alltså identisk med den föregående:

R
ggplot(data=gapminder) +
  # NYTT
  geom_point(aes(x=year,
                 y=pop)) +
  labs(x="Year",
       y="Population",
       tag="A",
       title="Titeln på grafen",
       subtitle="Undertiteln på grafen",
       caption="Figurförklaring hamnar här.")

Att definiera den estetiska mappningen högst upp är fördelaktigt eftersom man slipper upprepa mappningen i varje geom().

Låt oss färga punkterna baserat på kontinenten de tillhör. Detta görs i aes() genom att specificera att color=continent:

R
ggplot(data=gapminder, aes(x=year,
                           y=pop,
                           # NYTT
                           color=continent)) +
  geom_point() +
  labs(x="Year",
       y="Population",
       tag="A",
       title="Titeln på grafen",
       subtitle="Undertiteln på grafen",
       caption="Figurförklaring hamnar här.")

Till höger om grafen finns färgkodningen, vars label "continent" behöver justeras. Man kan ange en label i labs() med argumentet color.

R
ggplot(data=gapminder, aes(x=year,
                           y=pop,
                           color=continent)) +
  geom_point() +
  labs(x="Year",
       y="Population",
       tag="A",
       title="Titeln på grafen",
       subtitle="Undertiteln på grafen",
       caption="Figurförklaring hamnar här.",
       # NYTT
       color="Kontinent")

I gapminder finns flera rader för varje land. I nästa steg ska vi summera befolkningsmängden i varje kontinent varje kalenderår. För att göra detta använder vi dplyr enligt följande:

R
gapminder_summary <- gapminder |>
  # Gruppera på continent och year
  group_by(continent, year) |>
  # Beräkna summan av pop (för varje kontinent och år)
  summarise(population = sum(pop)) |>
  # Inaktivera grupperingen i data framen
  ungroup()

# Se data
gapminder_summary
continentyearpopulation
Africa1952237640501
Africa1957264837738
Africa1962296516865
Africa1967335289489
Africa1972379879541
Africa1977433061021
Africa1982499348587
Africa1987574834110
Africa1992659081517
Africa1997743832984
Africa2002833723916
Africa2007929539692
Americas1952345152446
Americas1957386953916
Americas1962433270254
Americas1967480746623
Americas1972529384210

Låt oss beräkna den totala populationen på varje kontinent varje kalenderår:

R
ggplot(gapminder_summary,
       aes(x=year,
       y=population,
       color=continent)) +
  geom_point()

Vi adderar en linje mellan punkterna för att tydligare se trenden:

R
ggplot(gapminder_summary,
       aes(x=year, y=population, color=continent)) +
  geom_point() +
  # NYTT
  geom_line()

Med geom_text() kan du lägga till text. Nu adderar vi geom_text() för att visa befolkningsmängden på varje datapunkt. Även geom_text() har estetisk mappning. Här anger vi endast argumentet label som vi definierar som variabeln population. X-värdet och y-värdet för geom_text() kommer ärvas från ggplot().

R
ggplot(gapminder_summary,
       aes(x=year, y=population, color=continent)) +
  geom_point() +
  geom_line() +
  # NYTT
  geom_text(aes(label=population))

Vi gör om exakt samma procedur men med geom_label() istället för geom_text(). Med geom_label() ges texten en bakgrund som gör den synligare:

Båda ovanstående grafer är suboptimala eftersom labels är placerade för nära varandra. Vi behöver en funktion som automatiskt kan separarera labels. Detta finns i ggrepel-paketet, vars funktion geom_text_repel() automatiskt separarear text. Paketet avlägsnar datapunkter som inte kan visualiseras på ett rimligt vis. Resultat är som regel tillfredsställande:

R
install.packages("ggrepel")
library(ggrepel)
R
ggplot(gapminder_summary,
       aes(x=year, y=population, color=continent)) +
  geom_point() +
  geom_line() +
  # NYTT
  geom_text_repel(aes(label=population))

Det är fortfarande otydligt. Möjligtvis blir det tillräckligt informativt att bara redovisa siffrorna första och sista året. Detta kan göras geno att beräkna maximalt respektive minimalt antal människor på varje kontinent. Dessa beräkningar görs och skickas till objekten max_population och min_population, som sedan också används i ggplot():

R
# Beräknar varje kontinents största population
max_population <- gapminder_summary %>%
  group_by(continent) %>%
  arrange(continent, desc(population)) %>%
  distinct(continent, .keep_all = T)

# Beräknar varje kontinents insta population
min_population <- gapminder_summary %>%
  group_by(continent) %>%
  arrange(continent, population) %>%
  distinct(continent, .keep_all = T)

# Visualiserar
ggplot(gapminder_summary,
       aes(x=year, y=population, color=continent)) +
  geom_point() +
  # NYTT
  # Text för max-värden
  geom_label_repel(data=max_population,
                  aes(x=year, y=population, color=continent, label=population)) +
  # NYTT
  # Text för minimi-värden
  geom_label_repel(data=min_population,
                  aes(x=year, y=population, color=continent, label=population))

Vi ska nu använda geom_hline() och geom_vline() för att lägga till horisontella och vertikala referenslinjer. Dessa brukar placeras bakom datapunkterna, vilket innebär att de måste deklareras innan datapunkterna (geom_point()) i koden. Vi placerar linjer på två nivåer på y-axeln (specificeras med argumentet yintercept) enligt nedan:

R
ggplot(data=gapminder, aes(x=year,
                           y=pop,
                           color=continent)) +
  geom_point() +
  
  # NYTT
  geom_hline(aes(yintercept=1000000000)) +  
  geom_hline(aes(yintercept=500000000)) +
  
  labs(x="Year",
       y="Population",
       tag="A",
       title="Titeln på grafen",
       subtitle="Undertiteln på grafen",
       caption="Figurförklaring hamnar här.")

Med geom_rect() kan ett fält definieras, enligt följande:

R
ggplot(data=gapminder, aes(x=year,
                           y=pop,
                           color=continent)) +
  # NYTT
  geom_rect(aes(xmin=1960, xmax=1990, ymin=500000000, ymax=100000000)) +  

  geom_point() +

  labs(x="Year",
       y="Population",
       tag="A",
       title="Titeln på grafen",
       subtitle="Undertiteln på grafen",
       caption="Figurförklaring hamnar här.")

Med geom_segment() kan du markera särskilt intressanta punkter. Funktionen har argumentet arrow för att rita pilar.

Notera att y-axeln uppvisar ett mycket stort intervall med stor skillnad mellan datapunkterna. I dessa scenarion är det fördelaktigt att logaritmera variabeln. Vi logaritmerar y-axeln genom att addera funktionen scale_y_log10() som logaritmerar alla y-värden. Det innebär att du kan göra matematiska beräkningar i samband med visualiseringen (datakällan ändras inte).

R
ggplot(data=gapminder, aes(x=year,
                           y=pop,
                           color=continent)) +
  geom_point() +
  # NYTT
  scale_y_log10()