Estetisk mappning

När du aktiverade tidyverse så fick du även tillgång till en data frame kallad mpg, som är förkortning för miles per gallon. Denna innehåller data på bilars bränsleförbrukning och är användbar för nedanstående övningar. Dessa data samlades in av US EPA (Environmental Protection Agency) och inkluderade 38 olika bilmodeller (https://fueleconomy.gov/).

Om du inte redan har tidyverse installeras det med följande kommando:

install.packages("tidyverse")

Aktivera tidyverse:

library(tidyverse)

Se första raderna i data:

mpg
manufacturer model displ year cyl trans drv cty hwy fl
audi a4 1.8 1999 4 auto(l5) f 18 29 p
audi a4 1.8 1999 4 manual(m5) f 21 29 p
audi a4 2.0 2008 4 manual(m6) f 20 31 p
audi a4 2.0 2008 4 auto(av) f 21 30 p
audi a4 2.8 1999 6 auto(l5) f 16 26 p
audi a4 2.8 1999 6 manual(m5) f 18 26 p
audi a4 3.1 2008 6 auto(av) f 18 27 p
audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26 p
audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25 p
audi a4 quattro 2.0 2008 4 manual(m6) 4 20 28 p

Första raderna i mpg.

mpg data

I mpg data finns 234 rader och följande 11 variabler:

  • manufacturer: manufacturer name
  • model: model name
  • displ: engine displacement, in litres
  • year: year of manufacture
  • cyl: number of cylinders
  • trans: type of transmission
  • drv: the type of drive train, where f = front-wheel drive, r = rear wheel drive, 4 = 4wd
  • cty: city miles per gallon
  • hwy: highway miles per gallon
  • fl: fuel type
  • class: "type" of car

För att koden i nedanstående övningar skall vara kortfattad kommer vi inte specificera några labels med labs() innan grafen är klar. I exemplet nedan skapar vi en graf med ggplot(). I ggplot() specificerar vi att data kommer från mpg och vi använder aes() för att mappa displ till x-axeln och hwy till y-axeln. Därefter lägger adderar vi geom_point() som visualiserar värdena på x och y med punkter. Vi behöver inte ange estetisk mappning (aes()) i geom_point() eftersom den kommer nedärvas från ggplot() automatiskt.

ggplot(data = mpg, aes(x = displ, y = hwy)) +
  geom_point()
Spridningsdiagram över mpg-data med motorvolym (displ) på x-axeln och bränsleeffektivitet (hwy) på y-axeln, svarta punkter

Du har precis skådat ggplot() skönhet, nämligen förmågan att bygga upp en graf med hjälp av lager. Ovanstående graf har bara ett enda lager, nämligen geom_point().

Estetisk mappning (aesthetic mapping)

Genom att bygga upp en graf med lager kan vi styra vilka data som visas i varje lager. I nästa graf skapar vi separata punkter för bilar som förbrukar mer respektive mindre än medelvärdet för bränsleförbrukningen (hwy). Notera att vi inte specificerar aes() i ggplot() utan istället i varje geom_point().

## Beräkna medelvärdet för bränsleförbrukning (hwy)
median_hwy <- median(mpg$hwy)

## Skapa grafen
ggplot() +
  # Bilar som föbrukar mer eller lika med medianvärdet
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # Bilar som föbrukar mindre än medianvärdet
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2)
Spridningsdiagram av displ mot hwy där bilar över eller på medianen för hwy är gula och bilar under medianen är blågröna

Därefter lägger vi till en horisontell linje som visar var medelvärdet är på y-axeln. Detta görs med geom_hline() på rad 16.

## Beräkna medelvärdet för bränsleförbrukning (hwy)
median_hwy <- median(mpg$hwy)

## Skapa grafen
ggplot() +
  # För bilar som föbrukar mer eller lika med medianvärdet
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # För bilar som föbrukar mindre än medianvärdet
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2) +
  geom_hline(yintercept=median_hwy)
Samma spridningsdiagram med gula och blågröna punkter samt en svart horisontell linje vid medianen hwy 24

Vi fortsätter genom att lägga till text (med geom_label())som visar medianvärdet på den horisontella linjen. Texten ska placeras längst till vänster på x-axeln och på medianvärdet på y-axeln. I funktionen geom_label() finns argumentet label som utgörs av texten ska visas på grafen, och i detta fall är detta helt enkelt medianvärdet (rad 17). Notera nedan att vi specificerar "längst till vänster" på x-axeln genom att skriva x=-Inf (negative infinity). Om vi önskar placera något längst till höger på x-axeln anger vi istället x=Inf. På så vis behöver vi inte själva identifiera minsta och största värdet på x-axeln.

## Beräkna medelvärdet för bränsleförbrukning (hwy)
median_hwy <- median(mpg$hwy)

## Skapa grafen
ggplot() +
  # För bilar som föbrukar mer eller lika med medianvärdet
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # För bilar som föbrukar mindre än medianvärdet
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2) +
  geom_hline(yintercept=median_hwy) +
  geom_label(aes(x=-Inf, y=median_hwy), label=median_hwy)
Spridningsdiagram med medianlinje där etiketten med medianvärdet delvis hamnar utanför grafens vänstra kant

Horisontell och vertikal justering (hjust, vjust)

Tyvärr hamnade en del av etiketten utanför grafen, vilket framgår av figuren ovan. Lyckligtvis har de flesta geom() även argumentet hjust och vjust som gör det möjligt att förskjuta en komponent (t ex en datapunkt eller en etikett) horisontellt eller vertikalt. Det kan inledningsvis vara lite krångligt att förstå hur hjust och vjust förskjuter komponenter men följande lathund underlättar mycket:

Lathund som visar hur textens placering relativt en punkt ändras med hjust och vjust 0, 0,5 och 1

Av ovanstående framgår att hjust=0 och vjust=0.5 borde förskjuta etiketten till höger på x-axeln. Låt oss prova detta (rad 17):

## Beräkna medelvärdet för bränsleförbrukning (hwy)
median_hwy <- median(mpg$hwy)

## Skapa grafen
ggplot() +
  # För bilar som föbrukar mer eller lika med medianvärdet
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # För bilar som föbrukar mindre än medianvärdet
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2) +
  geom_hline(yintercept=median_hwy) +
  geom_label(aes(x=-Inf, y=median_hwy), label=median_hwy, hjust=0, vjust=0.5)
Spridningsdiagram med medianlinje där etiketten 24 nu visas helt inne i grafen vid vänster kant

Koden justeras nu så att den estetiska mappningen (aes()) sker i ggplot(). I mpg finns kolumnen class som redovisar vilken typ av bil det är. Vi vill använda class för att färga datapunkterna. Detta gör vi genom att specificera att color=class i aes(). Syftet med detta är att undersöka om det finns ett samband mellan vilken klass bilen tillhör och bränsleförbrukningen (mwy).

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class)) +
  geom_point()

## Du kan skriva "color" eller "colour", båda varianterna accepteras
Spridningsdiagram av displ mot hwy där punkterna färgas efter bilklass (class) med färgförklaring till höger

Den estetiska mappningen i aes() påverkar alltså alla datapunkterna. I exemplet ovan specificerade vi att datpunkterna skulle få en unik färg för varje nivå i kolumnen class. Färgens betydelse redovisas till höger om figuren. Notera att färgförklaringen till höger har rubriken "class" vilket är kolumnen som specificerades i color.

Vi fortsätter att modifiera grafen genom att lägga till ytterligare information. Vi önskar nu att storleken på varje datapunkt skall vara en funktion av antalet cylindrar i motorn. Då mappar vi variabeln cyl till parametern size i aes():

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class,
                     size=cyl)) +
  geom_point()
Spridningsdiagram av displ mot hwy med färg efter bilklass och punktstorlek efter antal cylindrar (cyl)

Det verkar som att det finns ett starkt samband mellan antalet cylindrar och storleken på motorn (displ) samt bränsleförbrukningen (hwy). Bilar med låg bränsleförbrukning har liten motor (displ) och färre cylindrar (cyl). Notera också att det finns en storleksskala till höger om grafen och den har rubriken cyl, vilket vi mappade till size i aes(). I detta fall går det utmärkt att mappa cyl till size eftersom cyl är en numerisk variabel som går att rangordna.

Shape (form) och alpha (genomskinlighet, transparency)

I aes() kan man även specificera alpha som styr punkternas genomskinlighet, och shape som styr punkternas form. Du kan ange ett specifikt värde på alpha (t ex alpha=0.5 för 50% genomskinlighet) och shape (t ex shape=2 för att använda trianglar istället för punkter). Alternativt mappar du en kolumn till alpha och shape, vilket medför att ggplot() automatiskt mappar detta. Vi provar nu att mappa cyl till alpha:

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class,
                     size=cyl,
                     alpha=cyl)) +
  geom_point()
Spridningsdiagram med färg efter bilklass där både storlek och genomskinlighet styrs av antal cylindrar

Notera ovan att cyl nu används för att mappa punkternas storlek och genomskinlighet, och detta framgår också av förklaringen till höger om grafen. Vi provar nu mappa shape till cyl:

Vi provar nu att mappa class till shape. Vi justerar också storleken på punkterna genom att ange size=3, enligt följande:

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class,
                     shape=class)) +
  geom_point(size=3)
Spridningsdiagram där bilklass styr både färg och form; klassen suv saknar symbol eftersom endast sex former används

Du kan visualisera alla punkterna med en specifik shape (form). Det görs genom att manuellt ange shape i geom_point(). Du skall inte ange detta i aes(), utan som ett argument i geom_point(), enligt följande exempel där alla punkterna får shape=2, vilket är trianglar:

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class)) +
  geom_point(size=3, shape=2)
Spridningsdiagram där alla punkter är ofyllda trianglar (shape 2) färgade efter bilklass

Du kan specificera shape, color och size genom att mappa dessa egenskaper till variabler i din data frame, eller ange specifika värden. Följande gäller för shape, color och size:

Egenskap Funktion Kan specificeras med en variabel Kan specificeras manuellt
shape Ändrar formen på geom_point(). Ja. Tilldelar varje nivå (max 6 olika) en separat form. Exempel: shape=class Ja. Exempel: shape=2
size Ändrar storleken på geom_point(). Anges i millimeter (mm). Nej. Ja, med numeriskt värde.
color Ändrar färg på geom_point(). Ja. Exempel: shape=class Ja, med textsträng eller HEX-kod. Exempel textsträng: color="blue" Exempel HEX: color="#33333"

Vad beträffar shape visar nedanstående lathund formerna och deras motsvarande siffra.

Lathund över punktformerna i R med nummer 0 till 24, bland annat kvadrat, cirkel, triangel, romb och kryss