Da du aktiverede tidyverse, fik du også adgang til en data frame kaldet mpg, som er en forkortelse for miles per gallon. Den indeholder data om bilers brændstofforbrug og er nyttig til nedenstående øvelser. Disse data blev indsamlet af US EPA (Environmental Protection Agency) og omfattede 38 forskellige bilmodeller (https://fueleconomy.gov/).
Hvis du ikke allerede har tidyverse, installeres det med følgende kommando:
install.packages("tidyverse")Aktivér tidyverse:
library(tidyverse)Se de første rækker 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 |
De første rækker i mpg.
mpg data
I mpg data er der 234 rækker og følgende 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
For at holde koden i nedenstående øvelser kortfattet vil vi ikke angive nogen labels med labs(), før grafen er færdig. I eksemplet nedenfor laver vi en graf med ggplot(). I ggplot() angiver vi, at data kommer fra mpg, og vi bruger aes() til at mappe displ til x-aksen og hwy til y-aksen. Derefter tilføjer vi geom_point(), som visualiserer værdierne af x og y med punkter. Vi behøver ikke angive æstetisk mapping (aes()) i geom_point(), fordi den automatisk nedarves fra ggplot().
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point()
Du har netop set skønheden ved ggplot(), nemlig evnen til at opbygge en graf ved hjælp af lag. Ovenstående graf har kun ét enkelt lag, nemlig geom_point().
Æstetisk mapping (aesthetic mapping)
Ved at opbygge en graf med lag kan vi styre, hvilke data der vises i hvert lag. I den næste graf laver vi separate punkter for biler, der forbruger henholdsvis mere og mindre end middelværdien for brændstofforbruget (hwy). Bemærk, at vi ikke angiver aes() i ggplot(), men i stedet i hver geom_point().
## Beregn middelværdien for brændstofforbrug (hwy)
median_hwy <- median(mpg$hwy)
## Lav grafen
ggplot() +
# Biler, der forbruger mere end eller lig med medianværdien
geom_point(data = filter(mpg, hwy>=median_hwy),
aes(x = displ, y = hwy),
color="gold1",
size=2) +
# Biler, der forbruger mindre end medianværdien
geom_point(data = filter(mpg, hwy<median_hwy),
aes(x = displ, y = hwy),
color="cyan4",
size=2)
Derefter tilføjer vi en vandret linje, der viser, hvor middelværdien ligger på y-aksen. Det gøres med geom_hline() i linje 16.
## Beregn middelværdien for brændstofforbrug (hwy)
median_hwy <- median(mpg$hwy)
## Lav grafen
ggplot() +
# For biler, der forbruger mere end eller lig med medianværdien
geom_point(data = filter(mpg, hwy>=median_hwy),
aes(x = displ, y = hwy),
color="gold1",
size=2) +
# For biler, der forbruger mindre end medianværdien
geom_point(data = filter(mpg, hwy<median_hwy),
aes(x = displ, y = hwy),
color="cyan4",
size=2) +
geom_hline(yintercept=median_hwy)
Vi fortsætter ved at tilføje tekst (med geom_label()), der viser medianværdien på den vandrette linje. Teksten skal placeres længst til venstre på x-aksen og ved medianværdien på y-aksen. I funktionen geom_label() findes argumentet label, som udgøres af den tekst, der skal vises på grafen, og i dette tilfælde er det simpelthen medianværdien (linje 17). Bemærk nedenfor, at vi angiver "længst til venstre" på x-aksen ved at skrive x=-Inf (negative infinity). Hvis vi ønsker at placere noget længst til højre på x-aksen, angiver vi i stedet x=Inf. På den måde behøver vi ikke selv at finde den mindste og største værdi på x-aksen.
## Beregn middelværdien for brændstofforbrug (hwy)
median_hwy <- median(mpg$hwy)
## Lav grafen
ggplot() +
# For biler, der forbruger mere end eller lig med medianværdien
geom_point(data = filter(mpg, hwy>=median_hwy),
aes(x = displ, y = hwy),
color="gold1",
size=2) +
# For biler, der forbruger mindre end medianværdien
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)
Vandret og lodret justering (hjust, vjust)
Desværre havnede en del af etiketten uden for grafen, hvilket fremgår af figuren ovenfor. Heldigvis har de fleste geom() også argumenterne hjust og vjust, som gør det muligt at forskyde en komponent (f.eks. et datapunkt eller en etiket) vandret eller lodret. Det kan i begyndelsen være lidt besværligt at forstå, hvordan hjust og vjust forskyder komponenter, men følgende snydeark gør det meget lettere:

Af ovenstående fremgår det, at hjust=0 og vjust=0.5 burde forskyde etiketten til højre på x-aksen. Lad os prøve det (linje 17):
## Beregn middelværdien for brændstofforbrug (hwy)
median_hwy <- median(mpg$hwy)
## Lav grafen
ggplot() +
# For biler, der forbruger mere end eller lig med medianværdien
geom_point(data = filter(mpg, hwy>=median_hwy),
aes(x = displ, y = hwy),
color="gold1",
size=2) +
# For biler, der forbruger mindre end medianværdien
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)
Koden justeres nu, så den æstetiske mapping (aes()) sker i ggplot(). I mpg findes kolonnen class, som angiver, hvilken type bil det er. Vi vil bruge class til at farve datapunkterne. Det gør vi ved at angive color=class i aes(). Formålet med dette er at undersøge, om der er en sammenhæng mellem, hvilken klasse bilen tilhører, og brændstofforbruget (mwy).
ggplot(data=mpg, aes(x = displ,
y = hwy,
color=class)) +
geom_point()
## Du kan skrive "color" eller "colour", begge varianter accepteres
Den æstetiske mapping i aes() påvirker altså alle datapunkterne. I eksemplet ovenfor angav vi, at datapunkterne skulle have en unik farve for hvert niveau i kolonnen class. Farvernes betydning vises til højre for figuren. Bemærk, at farveforklaringen til højre har overskriften "class", hvilket er den kolonne, der blev angivet i color.
Vi fortsætter med at ændre grafen ved at tilføje yderligere information. Vi ønsker nu, at størrelsen af hvert datapunkt skal være en funktion af antallet af cylindre i motoren. Så mapper vi variablen cyl til parameteren size i aes():
ggplot(data=mpg, aes(x = displ,
y = hwy,
color=class,
size=cyl)) +
geom_point()
Det ser ud til, at der er en stærk sammenhæng mellem antallet af cylindre og motorens størrelse (displ) samt brændstofforbruget (hwy). Biler med lavt brændstofforbrug har en lille motor (displ) og færre cylindre (cyl). Bemærk også, at der er en størrelsesskala til højre for grafen, og den har overskriften cyl, som vi mappede til size i aes(). I dette tilfælde fungerer det udmærket at mappe cyl til size, fordi cyl er en numerisk variabel, der kan rangordnes.
Shape (form) og alpha (gennemsigtighed, transparency)
I aes() kan man også angive alpha, som styrer punkternes gennemsigtighed, og shape, som styrer punkternes form. Du kan angive en bestemt værdi for alpha (f.eks. alpha=0.5 for 50 % gennemsigtighed) og shape (f.eks. shape=2 for at bruge trekanter i stedet for punkter). Alternativt mapper du en kolonne til alpha og shape, hvilket betyder, at ggplot() automatisk mapper dette. Vi prøver nu at mappe cyl til alpha:
ggplot(data=mpg, aes(x = displ,
y = hwy,
color=class,
size=cyl,
alpha=cyl)) +
geom_point()
Bemærk ovenfor, at cyl nu bruges til at mappe punkternes størrelse og gennemsigtighed, og det fremgår også af forklaringen til højre for grafen. Vi prøver nu at mappe shape til cyl:
Vi prøver nu at mappe class til shape. Vi justerer også størrelsen på punkterne ved at angive size=3, som følger:
ggplot(data=mpg, aes(x = displ,
y = hwy,
color=class,
shape=class)) +
geom_point(size=3)
Du kan visualisere alle punkterne med en bestemt shape (form). Det gøres ved manuelt at angive shape i geom_point(). Du skal ikke angive dette i aes(), men som et argument i geom_point(), som i følgende eksempel, hvor alle punkterne får shape=2, hvilket er trekanter:
ggplot(data=mpg, aes(x = displ,
y = hwy,
color=class)) +
geom_point(size=3, shape=2)
Du kan angive shape, color og size ved at mappe disse egenskaber til variabler i din data frame eller ved at angive bestemte værdier. Følgende gælder for shape, color og size:
| Egenskab | Funktion | Kan angives med en variabel | Kan angives manuelt |
|---|---|---|---|
shape |
Ændrer formen på geom_point(). |
Ja. Tildeler hvert niveau (maks. 6 forskellige) en separat form. Eksempel: shape=class |
Ja. Eksempel: shape=2 |
size |
Ændrer størrelsen på geom_point(). Angives i millimeter (mm). |
Nej. | Ja, med numerisk værdi. |
color |
Ændrer farven på geom_point(). |
Ja. Eksempel: shape=class |
Ja, med tekststreng eller HEX-kode. Eksempel tekststreng: color="blue" Eksempel HEX: color="#33333" |
Hvad angår shape, viser nedenstående snydeark formerne og deres tilsvarende tal.
