Chapter 7 Grafische exploratie

In dit hoofdstuk maken we weer gebruik van de mpg data en het tidyverse package.

library(tidyverse)

In R kunnen op veel manieren grafieken van (variabelen uit) de data gemaakt worden. Voor het maken van de figuren is het package ggplot2 nodig. ggplot2 is een onderdeel van het tidyverse-package

De ggplot2 functie bestaat uit een aantal verschillende onderdelen. Je begint altijd met ggplot(). ggplot() is een coördinatensysteem waar lagen aan toegevoegd kunnen worden. Aan de ggplot() functie moet je een dataset toevoegen die je wilt gebruiken, bijvoorbeeld ggplot(data = mpg). Vervolgens kan je lagen toevoegen.

De lagen die je kan toevoegen worden ook wel geom-functies genoemd. Een voorbeeld van een geom-functie is geom_point, waarmee je een spreidingsdiagram kan maken. In dit hoofdstuk zul je verschillende geom-functies leren.

Elke geom-functie heeft een bepaalde mapping. Hierin worden de visuele eigenschappen van de figuren bepaald. De mapping is altijd gekoppeld aan aes(), waar ook de x- en y-variabelen voor het figuur bepaald worden.

Let op: het maken van grafieken met ggplot2kan op verschillende manieren. Zo kan er bijvoorbeel ook gebruik gemaakt worden van pipes. In dit hoofdstuk worden de manieren waarop ggplot2gebruikt kan worden door elkaar gebruikt. Het is dus goed om je te beseffen dat er meer manieren zijn om tot dezelfde grafiek te komen dan dat in dit hoofdstuk weergeven wordt.

Let op: De functies gebruikt in dit hoofdstuk kunnen ook met elkaar gecombineerd worden. In de paragrafen worden de belangrijkste geom-functies benoemd, extra functies, zoals het toevoegen van kleur, worden niet overal benoemd, maar kunnen wel bij elke geom-functie toegepast worden. Daarnaast kunnen sommige geom-functies ook met elkaar gecombineerd worden. Zo kan je ook een faced-wrap maken bij een boxplot of een histogram.

7.1 Staafdiagram

Staafdiagrammen geven een grafische weergave van de frequentietabel van een variabele. Staafdiagrammen worden gemaakt via de geom-functie geom_bar(). In mappings kan aangegeven worden voor welke variabele je een staafdiagram wilt maken.

ggplot(data = mpg, mapping = aes(x = class)) +
  geom_bar()

Voor het geven van een kleur aan de omlijning, vul je buiten de haken van aes na colour een kleur in. Hierbij is het belangrijk dat de kleur tussen aanhalingstekens staat.

ggplot(data = mpg, mapping = aes(x = class)) +
  geom_bar(colour = "purple")

Voor het kleur geven aan de staven, vul je de kleur in na fill. Hierbij is het ook belangrijk dat het buiten de haken van aes staat en dat de kleur tussen aanhalingstekens staat.

ggplot(data = mpg, mapping = aes(x = class)) +
  geom_bar(fill = "purple")

Toevoegen tweede variabele

Er kan ook een tweede variabele toegevoegd worden aan de staafdiagram. Hierdoor kan je inzicht krijgen in de verdeling van de tweede variabele voor iedere categorie van je eerste variabele.

ggplot(data = mpg, mapping = aes(x = class, fill = trans)) +
  geom_bar()

Met de volgende code wordt de verdeling van de tweede variabele per categorie van de eerste variabele zichtbaar. Hierbij valt de frequentie van de categorieën weg.

ggplot(data = mpg, mapping = aes(x = class, fill = trans)) +
  geom_bar(position = "fill")

Met de volgende code krijg je een staafdiagram van de tweede variabele per categorie van de eerste variabele.

ggplot(data = mpg, mapping = aes(x = class, fill = trans)) +
  geom_bar(position = "dodge")

7.2 Histogram

Histogrammen worden gebruikt voor het inzichtelijk maken van continue data. Voor histogrammen wordt de geom-functie geom_histogram() gebruikt.

ggplot(data = mpg, mapping = aes(x = cty))+
  geom_histogram()

Ook bij histogrammen is het mogelijk om de kleur van de omlijning en van de staven aan te passen.

ggplot(data = mpg, mapping = aes(x=cty))+
  geom_histogram(colour = "purple", fill = "white")

Binning

Een histogram maakt gebruik van een binwidth, dus welke waarde van de x-variabele samen worden gevoegd tot één staaf. Bij een binwidth van 10 betekent dit dat de eerste staaf de scores 0-9 omvat, de tweede staaf de scores 10-19, etc.

Voor het maken van een histogram is het van belang om de juiste binwidth te bepalen, zodat je grafiek voldoende informatie bevat zonder chaotisch te worden.

ggplot(data = mpg, mapping = aes(x = cty))+
  geom_histogram(colour = "pink", fill = "white", binwidth = 10)

mpg %>% ggplot(mapping = aes(x = cty))+
  geom_histogram(colour = "pink", fill = "white", binwidth = 1)

Naast het gebruik van binwidth, kan ook bins gebruikt worden. Door gebruik te maken van bins geef je aan hoeveel staven je wilt hebben en kiest R de geschikte binwidth erbij.

ggplot(data = mpg, mapping = aes(x = cty))+
  geom_histogram(colour = "pink", fill = "white", bins = 12)

Toevoegen van een lijn

Met de volgende code is er een lijn toegevoegd bij x = 10.

ggplot(data = mpg, mapping=aes(x = cty))+
  geom_histogram(color ="purple", fill = "white")+
  geom_vline(aes(xintercept = 10))

Met de volgende code is er een lijn toegevoegd bij het gemiddelde van de variabele. Daarnaast zijn er ook grafische veranderingen aan de lijn gedaan.

mpg %>% ggplot(mapping = aes(x = cty))+
  geom_histogram(color= "purple", fill = "white")+
  geom_vline(aes(xintercept=mean(cty)),color = "blue", linetype = "dashed")

7.2.1 Normaalcurve

Voor het toevoegen van de normaalcurve kan een stat_function() toegevoegd worden. Hierbij is het ook belangrijk dat bij de aes van het histogram y = after_stat(density) staat.

mpg %>% ggplot()+
  geom_histogram(mapping = aes(x = cty, y = after_stat(density)))+
  stat_function(fun = dnorm, args = list(mean = mean(mpg$cty),sd = sd(mpg$cty)),col = "blue",   linewidth = 1)

7.3 Spreidingsdiagram

Een spreidingsdiagram, of ook wel een scatter plot, wordt gebruikt om verbanden tussen continue variabelen te onderzoeken. Voor spreidingsdiagrammen wordt de geom-functie geom_point() gebruikt.

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

Het visueel weergeven van een derde variabele kan via de punten in het spreidingsdiagram. Een derde variabele kan bijvoorbeeld toegevoegd worden door middel van kleur. De optie colour kan ook vervangen worden door bijvoorbeeld size, alpha en shape. Let op R gebruikt bij shape maximaal zes vormen, als je derde variabele meer categorieën heeft, gaat er informatie verloren bij het gebruik van shape.

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

7.3.1 Toevoegen van labels

Via de functie geom_text() is het mogelijk om labels te geven aan de punten. Het verplaatsen van het label kan met de codes hjust en vjust. Hiermee kan het label horizontaal en verticaal verplaatst worden.

ggplot(data = mpg, mapping= aes(x = displ, y = hwy)) +
  geom_point() +
  geom_text(aes(label = cty), hjust = 1, vjust = 1)

7.3.2 Jitter

Bij het maken van spreidingsdiagrammen voor variabelen waarbij er een beperkt aantal antwoordmogelijkheden beschikbaar is, kan het lastig zijn een spreidingsdiagram goed te interpreteren. Er is maar een beperkt aantal plaatsen op het spreidingsdiagram waarop de punten zich kunnen bevinden, waardoor veel punten zullen overlappen. Daardoor krijg je een minder goed beeld van waar de data zich bevindt. Zie bijvoorbeeld dit spreidingsdiagram:

ggplot(data = mpg, mapping = aes(x = drv, y = year)) + 
    geom_point() 

In R zit een speciale functie om toch een beter inzicht te kunnen krijgen in de data. Door elk punt in de spreidingsdiagram een heel klein beetje te verplaatsen naar een willekeurige positie, ontstaat er een beetje kunstmatige “ruis”. Wanneer je dit toevoegt, wordt zichtbaar waar veel van de datapunten zich bevinden, ze overlappen nu niet meer! Dat ziet er als volgt uit:

ggplot(data = mpg, mapping = aes(x = drv, y = year)) + 
    geom_point(position= "jitter") 

7.3.3 Toevoegen van een lijn

Via verschillende geom-functies kunnen er lijnen toegevoegd worden aan het spreidingsdiagram.

7.3.3.1 Loess lijn

Met de functie method = "loess" een loess lijn toe aan de grafiek.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
  geom_point() + 
  geom_smooth(method = "loess")

In deze code kunnen ook extra commando’s gegeven worden aan één laag van de plot.

mpg %>% ggplot(mapping = aes(x = displ, y = hwy)) +
  geom_point(mapping = aes(color = drv)) + 
  geom_smooth()

Ook kunnen er verschillende lijnen in het figuur weergeven worden, waarbij elke lijn bij een groep hoort.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv)) + 
  geom_point() + 
  geom_smooth(se = FALSE)

7.3.3.2 Regressielijn

Met geom_smooth(method = "lm", se= FALSE) kan er ook een regressielijn toegevoegd worden aan de spreidingsdiagram.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
  geom_point() + 
  geom_smooth(method = "lm", se = FALSE)

Ook dit is mogelijk voor verschillende groepen

ggplot(data = mpg, aes(x = displ, y = hwy, colour = drv)) + 
  geom_point() + 
  geom_smooth(method = "lm", se=FALSE)

7.3.3.3 Ander soort lijnen

  • geom_hline() ;Horizontale lijn
  • geom_vline() ;Verticale lijn
  • geom_abline() ;Hellende lijn

In het onderstaande plaatje is ter illustratie een spreidingsdiagram gemaakt waarin drie lijnen zijn toegevoegd. Voor het overzicht is er met xlim en ylim aangegeven welk gedeelte van de grafiek zichtbaar moet zijn. geom_hline() wordt gebruikt voor een horizontale lijn en gaat daarom samen met yintercept =. Voor geom_vline() wordt xintercept = gebruikt omdat het om een verticale lijn gaat. Tot slot moet je bij geom_abline() aangeven wat de constante (= intercept=, of wel het punt waar de lijn de y-as snijdt) en de helling (= slope=) aangeven.

ggplot(mpg, aes(cty, hwy)) + geom_point()+
  xlim(0,35) + ylim(0,50)+
  geom_hline(mapping = aes(yintercept= 30))+
  geom_vline(mapping = aes(xintercept= 20))+
  geom_abline(mapping  = aes(intercept= 8, slope= 1))

7.4 Piechart

Een piechart wordt gemaakt met de combinatie van de geom-functies geom_bar() en coord_polar().

ggplot(mpg, aes(x = "",y = drv, fill = drv)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0)

7.5 Boxplot

Boxplots worden gebruikt om de verdeling van variabelen te onderzoeken. Het maken van boxplots gaat via de geom-functie geom_boxplot().

ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
  geom_boxplot()

Er kan een derde variabele toegevoegd worden door de mapping fill=factor toe te voegen. Nu is er een losse boxplot gemaakt voor elk van de categorieën. (Let op: sommige categorieën van class hebben geen verschillende categorieën van drv. Om deze reden hebben in het volgende voorbeeld niet alle categorieën van class drie verschillende boxpots.)

ggplot(data= mpg, aes(x= class, y = hwy, fill = factor(drv))) +
  geom_boxplot()

7.6 Errorbars

Een errorbar geeft een grafische weergave van de onzekerheidsmarge rond gemiddelden. Voor het maken van een errorbar is het gemiddelde, de standaarddeviatie en de standaardfout van een variabele nodig. Hiervoor gebruiken we de codes group_by() en summarize() zoals uitgelegd in hoofdstuk 3.

gem_data <- mpg %>%
  group_by(class)%>%
  summarize (mean_displ = mean(displ),sd_displ = sd(displ), count=n(), se_displ = (sd_displ/(sqrt(count))))

Vervolgens kunnen de errorbars met deze informatie gemaakt worden.

ggplot(gem_data, aes(x = class,y = mean_displ, ))+
  geom_line(linewidth = 1) +
  geom_point(linewidth = 2)+
  geom_errorbar(aes(ymin = mean_displ-se_displ, ymax = mean_displ+se_displ), width =.2)
## Warning in geom_point(linewidth = 2): Ignoring unknown parameters: `linewidth`

Er kunnen ook errorbars toegevoegd worden aan je staafdiagram.

ggplot(gem_data, aes(x = class, y = mean_displ))+
  geom_bar(stat = "identity", fill = "purple", position = position_dodge())+
  geom_errorbar(aes(ymin = mean_displ-se_displ, ymax = mean_displ+se_displ), width = .2)

7.7 QQ en PP Plot

QQ plots worden gebruikt om te onderzoeken of de verdeling van een variabele gelijk is aan de normale verdeling. Het maken van een QQ-plot gaat via de geom-functies geom_qq en geom_qq_line.

ggplot(data = mpg, aes(sample=cty))+
  geom_qq()+
  geom_qq_line()

Voor het maken van een pp-plot is het package qqplotr nodig. Vervolgens kan een pp-plot gemaakt worden met de code pp_conf_plot()ggplot. In het onderstaande voorbeeld is een pp-plot gemaakt van de prijs van de diamanten.

install.packages("qqplotr")
library(qqplotr)
ggplot(data = diamonds, mapping = aes(sample = price)) +
stat_pp_line() +
stat_pp_point()

7.8 Facets

Voor categorische variabelen kan het handig zijn om je plot in subplots op te delen. Dit kan via de geom-functie facet_wrap.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_point() + 
  facet_wrap(~ class, nrow = 2)

Wanneer je rekening wilt houden met twee variabelen kan er een grid gemaakt worden dit kan via de geom-functie facet_grid.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_point() + 
  facet_grid(drv ~ cyl)

7.9 Extra functies

ggplot2 kent nog veel meer functies voor de visualisatie van de data, te veel om te kunnen omvatten in deze handleiding. Wel is er hier nog even kort aandacht voor het labelen van de x- en y-as, de functie themes() en kleuren in R.

labelen van de x- en y-as

Met de functie labs() is het mogelijk om een label te geven aan de x- en y-as.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_point()+
  labs(x = "Engine displacement, in litres", y= "Highway miles per gallon")

Limieten van de assen

Met de functies xlim() en ylim() kunnen de limieten van de x en y-as aangegeven worden. Hiermee kan je dus aangeven welk gedeelte van de grafiek je zichtbaar wilt hebben.

ggplot(data = mpg, mapping = aes(x = displ)) + 
  geom_histogram()+
  ylim(0,35)+
  xlim(0,8)

Thema’s

Met de functie theme() kunnen er visuele aanpassingen aan de grafieken gedaan worden. Hierin is er van alles mogelijk. In het onderstaande voorbeeld wordt alle tekst 90 graden gedraaid zodat de labels elkaar niet overlappen en ze duidelijk leesbaar zijn.

mpg %>% ggplot( mapping = aes(x = model, y = hwy)) + 
  geom_point()+
  theme(axis.text.x=element_text(angle = 90, hjust = 1))

Het package ggthemes bevat extra functies die aansluiten bij ggplot2. Hierbij moet het figuur eerst opgeslagen worden als object. Hieronder wordt één voorbeeld van visuele aanpassingen weergeven.

library(ggthemes)
histo_displ <-ggplot(data = mpg, mapping = aes(x = displ)) + 
  geom_histogram()+
  labs(x = "Engine displacement, in litres", y = "Frequentie")
histo_displ + theme_hc()+ scale_colour_hc()
## `stat_bin()` using `bins = 30`. Pick better value with
## `binwidth`.

Kleuren

In R zijn heel veel verschillende kleuren mogelijk voor de figuren. Een overzicht hiervan is weergeven op: https://www.rapidtables.com/web/color/RGB_Color.html. Hierbij is het belangrijk dat de kleur in woorden of de hex code vermeld staat tussen aanhalingstekens

ggplot(data = mpg, mapping = aes(x=cty))+
  geom_histogram(colour = "#DC143C", fill = "#4169E1")