Inleiding

Een van de belangrijkste redenen voor statistici en academici om over te stappen op R als statistisch programma is vanwege de zeer krachtige grafische weergave mogelijkheden. Alvorens een uitgebreide uitleg hoe een grafiek gemaakt wordt is het belangrijk stil te staan bij de keuze voor een type grafische weergave.

Het cursuspakket

Tijdens onderstaande uitleg wordt gebruikt gemaakt van een aantal databestanden. Download nu het cursuspakket en plaats de data bestanden in de working directory.

Data Management Script:

# Importeer clean dataset
mydata <- read.csv("mortaliteit.csv", header=TRUE, sep=",")

## Data cleanup ##
# converteer datum en tijd naar class date
mydata$gebdat <- as.Date(mydata$gebdat)
mydata$opndat <- as.Date(mydata$opndat)
mydata$ontdat <- as.Date(mydata$ontdat)
mydata$datdood <- as.Date(mydata$datdood)

## DATA MANIPULATIE ##
# Maak een nieuwe variabele leeftijd op basis van de geboortedatum en de opnamedatum
mydata$age <- round(as.numeric(mydata$opndat - mydata$gebdat)/365.25,0)

# Verwijder rijen met leeftijd outliers
mydata <- subset(mydata, age > 1)       # verwijder alle rijen met een leeftijd < 2 jaar.

Keuze Grafiek

De keuze voor een grafiek begint met de vraag: wat is het doel van de grafiek? Hieronder volgen een aantal voorbeelden van geschikte grafiek types per doel.

1. Visualiseren distributie en deviatie
Uitleg: Hoe is de data verdeeld?
geschikte grafieken:

  • Piecharts (nominaal)
  • Barchart (ordinaal)
  • Histogram (continue)
  • Boxplot (continue)

2. Vergelijking van variabelen
Uitleg: Voor het vergelijken van meerdere variabelen met elkaar
Geschikte grafieken:

  • Boxplot (side to side)
  • Scatterplot (continue)
  • Multiplots
  • Scatterplot matrix (correlatie analyse)

3. Trendgrafieken
Uitleg: Voor het visualiseren van herhaalde metingen en voor survival analyses
Geschikte grafieken:

  • Boxplot (side to side)
  • Linechart
  • Survivalplot (Kaplan Meier analyse)

4. Vergelijking van groepen op meerdere niveau’s
Uitleg: Het visualiseren van bepaalde variabelen per groep (bv. gemiddelde leeftijd per geslacht)
Geschikte grafieken:

  • Multi-boxplot
  • Multi-histogram
  • Multi-scatterplot

Grafiek Opmaak

voorbeeld van een grafiek met de belangrijkste grafische parameters:

# plot de variabele x over y.
plot(mydata$age, mydata$creaurer,                   
      main="titel",             # De titel van de grafiek
      sub="subtitel",           # De subtitel van de grafiek
      xlab="X-axis label",      # De label van de x-as: $age
      ylab="Y-axix label",      # De label van de y-as: $creaurer
      xlim=c(min(mydata$age), max(mydata$age)),                 # De limieten van de x-as (min tot max)
      ylim=c(min(mydata$creaurer), max(mydata$creaurer))        # De limieten van de y-as (min tot max)
      )

Grafische parameters

Dit zijn de standaard instellingen (parameters) voor grafiek en plot opmaak in R. Deze zijn te veranderen met de par() functie. De parameters zijn ook per grafiek in te stellen. Standaard zijn alle kleuren zwart.

## Voorbeeld met par()
par()                           # bekijk de huidige settings
opar <- par()                   # voorbeeld: maak een kopie van de oude settings
par(col.lab="red")              # verander de x en y label tekstkleur in rood
par(opar)                       # herstel oude settings
# Voorbeeld met een grafische parameter in een plot functie 
hist(mydata$visus, col.lab="red")

Parameters:

kleuren Beschrijving
col kleur van de plot punten of lijnen
col.axis kleur voor de axis anotatie
col.lab kleur van de x en y labels
col.main kleur van de titel
col.sub kleur van de subtitel
fg plot voorgrond kleur
bg plot achtergrond kleur
- -
Tekst Beschrijving
font integer voor de font opmaak. 1 = normaal, 2 = dikgedrukt, 3 = schuingedrukt, 4 = dikgedrukt + schuin, 5 = symbool
ps lettergrootte
- -
Formaat Beschrijving
mar vector: c(bottom, left, top, right) in lines. standaard = c(5, 4, 4, 2) + 0.1
mai numerieke vector voor de margin size: c(bottom, left, top, right) in inches
pin plot dimensies (breedte, hoogte) in inches
- -

Grafiek in stappen

Alle bovengenoemde parameters zijn te gebruiken in combinatie met core plot functies. Het is ook mogelijk om de grafiek in lagen op te bouwen. Hiervoor zijn een aantal functies beschikbaar die in serie met een core plot functie gebruikt dienen te worden. Begin een grafiek altijd met een core plot() functie. De overige functies kunnen in willekeurige volgorde.

Functie Beschrijving
plot() Begin altijd met een core plot functie (ook mogelijk: hist(), barchart(), boxplot(), etc)
points() voeg punten toe (x,y)
lines() Voeg lijnen toe (x,y)
title() Voeg een titel toe
legend() Voeg een legenda toe
axis() Opmaak van de assen, gebruik parameter at=[vector]
mtext() Voeg text aan de margins van de grafiek toe
abline() Trek een lijn door de grafiek
segments() voeg lijnstukken toe
## voorbeeld LEGE plot
plot(0,ann=FALSE,type="n") # ann= -> geen annotatie, type=n -> geen inhoud in plot

## voorbeeld plot met lines
plot(datavector1,type="l",col=2) # col=2 -> rode kleur
lines(datavector2,type="l",col=3) # col=3 -> groene kleur

## voeg de labels toe
# voorbeeld 1:
title(main="Hoofd-titel", sub="sub-titel", xlab="x-axis label", ylab="y-axis label")
# voorbeeld 2:
title(main="De Titel", col.main="red", sub="De Sub-titel", col.sub="blue", xlab="De X label", ylab="De Y label",col.lab="green", cex.lab=0.75)

## Plaats tekst in de margins
mtext("Hallelujah", side = 4, line=1)

## Voeg een legenda toe
legend("topright", inset=.05, title="topright legenda", c("A","B","C"), fill=terrain.colors(3), horiz=TRUE)

## voeg lijnen toe
# voeg een horizontale lijn toe
abline(h=c(1,5,7)) # voeg 3 horizontale lijnen toe op de y-as waarde: 1,5,7

# voeg drie verticale lijnen toe
abline(v=c(75,80,90),lty=2,col="blue")

# voeg een best-of-fit lijn toe
abline(lm(y ~ x, data=mydata))

# voeg een regressielijn toe, met als intercept "0"
abline(lm(y ~ x + 0, data=mydata), col="blue")

Grafieken opslaan

Het opslaan van grafieken kan op 2 manieren. Vanuit het ‘menu’ -> Save As of via de commandprompt. Het is aanbevolen om grafieken op te slaan als .png of indien een hoge resolutie gewenst is (wat voor veel tijdschriften het geval is) als .tiff bestand.

Functie Bestandsformaat
pdf(“mygraph.pdf”) .pdf
png(“mygraph.png”) .png
bmp(“mygraph.bmp”) .bmp
tiff(“mygraph.tiff”) .tiff

Tiff figuren

# Open nieuwe plot
tiff("c:/mygraphs/myplot.tiff") # include formaat, kleur, font, resolutie opslag .lzw (comprimeren)

# Maak de plot
plot(x,y)  

# Sluit af
dev.off() # hiermee wordt de tiff() functie afgesloten en word de figuur opgeslagen

Grafieken

Hieronder volgt een bespreking en instructie van de meest voorkomende type grafieken.

Scatterplot

De functie plot() kan gebruikt worden om een scatterplot, lijnplot of combinatie ervan te maken.

Type Beschrijving
p punten
l lijnen
o overplotted punten en lijnen
b, c punten met een lijn erdoor getrokken
s, S traptreden
h histogram-achtige verticale lijnen
n LEEG: maakt geen punten of lijnen

Voorbeeld van een scatterplot:

# maak een scatterplot met de functie plot()
plot(mydata$age,mydata$mmse,                            # x variabele = leeftijd, y variabele = mmse
      type = "p",                                       # gebruik "punten" voor de variabelen
      main="MMSE-scores per leeftijd",                  # De titel van de grafiek
      xlab="Leeftijd",                                  # De label van de x-as: leeftijd
      ylab="MMSE score",                                # De label van de y-as: MMSE score
      xlim=c(min(mydata$age), max(mydata$age)),         # De limieten van de x-as (min tot max)
      ylim=c(min(mydata$mmse), max(mydata$mmse))        # De limieten van de y-as (min tot max)
      )

Lees meer over Scatterplots

lijnplot

De relevante parameters voor een lijnplot:

Lijnen Beschrijving
lty lijn typen
lwd lijndikte relatief aan de default (1). Loopt van 1 - 6.
pch symboomtype voor de plot punten. Loopt van 1 - 26.

Voorbeeld van een lijnplot:

# tussenstap, maak een nieuwe dataframe met de gemiddelde MMSE score per unieke leeftijd
df <- aggregate(mmse~age, data=mydata, FUN=function(x) mean=mean(x))

# maak een lijnplot met de functie plot()
plot(df,                                                # x variabele = leeftijd, y variabele = MMSE score
      type = "l",                                       # gebruik "punten" voor de variabelen
      main="Gemiddelde MMSE-scores per leeftijd",       # De titel van de grafiek
      xlab="Leeftijd",                                  # De label van de x-as: leeftijd
      ylab="MMSE score",                                # De label van de y-as: MMSE score
      xlim=c(min(mydata$age), max(mydata$age)),         # De limieten van de x-as (min tot max)
      ylim=c(min(mydata$mmse), max(mydata$mmse))        # De limieten van de y-as (min tot max)
      )

Lees meer over Line plots.

Histogram

Een histogram geeft een grafische weergaven van de frequentieverdeling van een variabele gegroepeerd in klassen. Het is een categoriale weergave van een continue variabele.

Voorbeeld van een histogram:

# Maak een histogram met de functie hist()
hist(mydata$mmse,                                       # x variabele = leeftijd, y variabele = frequentie(x)
      main="MMSE-scores",                               # De titel van de grafiek
      xlab="MMSE",                                      # De label van de x-as: MMSE score
      ylab="frequentie",                                # De label van de y-as: Frequentie
      xlim=c(min(mydata$mmse), max(mydata$mmse)),       # De limieten van de x-as (min tot max)
      col.main="red",                                   # kleur van de main titel
      col.lab="blue",                                   # kleur van de x/y labels
      col = "green"                                     # kleur van de grafiek inhoud
     )

Interpretatie:
Er is duidelijk te zien dat de MMSE scores niet normaal verdeeld zijn. Dit is te analyseren met de kurtosis en skewness en te toetsen met de kolgomorov en Chapiro-Wilks test. Het visualiseren van de distributie (is er sprake van een normaalverdeling?) kan beter met een boxplot.

Lees meer over histogrammen.

Boxplot

Boxplot

Er zijn twee methodes om de boxplot functie te gebruiken: boxplot.default en boxplot.formula. Hier wordt gebruik gemaakt van de formule methode. Zie ?boxplot() voor meer informatie.

Voorbeeld van een DEFAULT boxplot: boxplot van de MMSE scores

boxplot(mydata$mmse,
        las=1                               # gebruik horizontale tekst labels
        )

Voorbeeld van een FORMULA boxplot: dubbele boxplot van de MMSE scores per groep (delier of geen delier)

boxplot(formula = mmse~delier, data = mydata, 
        horizontal=TRUE,                      # Horizontale ipv verticale boxplot
        main="MMSE scores"
        )

Interpretatie:
Er lijkt een verschil te zijn in de mediaan en distributie van de MMSE scores per groep patiënten: zonder of met delier.

Lees meer over Boxplots

Barplot

Een barplot (staafdiagram) is een grafische weergave van een frequentieverdeling uit een discrete kansverdeling. Het is de tegenhanger van de histogram (voor continue data).

Voorbeeld van een absolute barplot:

# Tussenstap: maak een kruistabel van geslacht en delier
xtabs(~sexe+delier, data = mydata)
##        delier
## sexe    delier geen delier
##   man       20         117
##   vrouw     51         405
# Maak een barplot
barplot(height = xtabs(~sexe+delier, data = mydata),    # zonder tussenstap
        beside = TRUE,
        col = c(3, 4),
        xlab = "Delier per geslacht"
        )

# Voeg een legenda toe
legend("topleft", inset=.05, title="legenda", c("man","vrouw"), fill = c(3,4), horiz=TRUE)

Voorbeeld van een relatieve barplot:

# Tussenstap: maak een kruistabel van geslacht en delier
mytable <- xtabs(~sexe+delier, data = mydata)
# Tussenstap 2: maak een proportionele kruistabel van geslacht en delier
prop.table(mytable)
##        delier
## sexe        delier geen delier
##   man   0.03372681  0.19730185
##   vrouw 0.08600337  0.68296796
# Maak een barplot
barplot(prop.table(mytable),    # zonder tussenstap 2
        beside = TRUE,
        col = c(3, 4),
        xlab = "Delier per geslacht"
        )

# Voeg een legenda toe
legend("topleft", inset=.05, title="legenda", c("man","vrouw"), fill = c(3,4), horiz=TRUE)

Lees meer over Barplots.

EXTRA: Voorbeeld van een Mosaic

# Tussenstap: maak een kruistabel van geslacht en delier
mytable <- xtabs(~sexe+delier, data = mydata)

# Laad package grid en vcd
library(grid); library(vcd) # grid is een dependencie van vcd en wordt door vcd automatisch opgeroepen

# <Maak een mosaic plot
mosaic(mytable)

Interpretatie: Het voordeel van een Mosaic ten opzichte van een barplot is dat bij een mosaic duidelijk te zien is dat er meer vrouwen dan mannen voorkomen in de patiëntpopulatie. Ook is te zien dat er relatief meer mannen als vrouwen een delier hadden.

Lees meer over Mosaics.

Cirkeldiagram

Cirkeldiagrammen zijn geschikt voor het weergeven van de frequentie van de levels van een factor variabele. Het beste kan dit middels een tussenstap met de functie table().

Voorbeeld van een plot:

# Tussenstap: maak een frequentietabel
mytable <- table(mydata$medicijn)

# maak een cirkeldiagram
pie(mytable,
    labels = levels(mydata$medicijn)   # gebruik de factor levels als label namen
    )

Lees meer over Cirkeldiagrammen.


Multi Grafieken

Er zijn twee manieren om grafieken te combineren: over elkaar (combiplot) of naast elkaar (multiplot)

Combiplots

Het maken van een een combinatie van grafieken is mogelijk met R. Hieronder volgt een voorbeeld van een histogram en bijbehorende lijngrafiek. Meer van dit soort plots zijn te vinden op Quick-R. Meer informatie over hoe deze plots gemaakt worden is te vinden op R Cyclismo. De essentie is: gebruik lines().

# Defineer de variabele en maak een histogram
x <- mydata$visus
h <- hist(x)

## Here comes the magic
# Maak een sequentie op basis van x (mydata$visus) met 60 tussenstappen
xfit <- seq(min(x),max(x),length=60)
# Maak een normaal verdeling (gemiddelde + standaard deviatie) van xfit
yfit <- dnorm(xfit,mean=mean(x),sd=sd(x))
# tranformeer de y variabele op basis van de distributie van het histogram 
yfit <- yfit*diff(h$mids[1:2])*length(x)

# voeg de lijn toe
lines(xfit, yfit, col="blue", lwd=2) 

# Bronvermelding: bedacht door Peter Dalgaard

Multiplots

Het maken van een grafiek waarbij meerdere plots worden getoond is mogelijk met de eerder genoemde par() functie of met de package ggplot: functie multiplot(). Lees meer.

Voorbeeld van een multi grafiek:

# Maak een 2 bij 2 tabel met par
par(mfrow=c(2,2))

##  maak nu 4 plots in de volgorde van linksboven, rechtsboven, linksonder, rechtsonder.

# barplot frequentie van MMSE scores
barplot(table(mydata$mmse), main="Barplot van MMSE scores")

# histogram van MMSE scores
hist(mydata$mmse, main="Histogram van MMSE scores")

# boxplot van MMSE scores per geslacht
boxplot(mmse~sexe, data= mydata, horizontal=TRUE, main="MMSE scores per geslacht")

# cirkeldiagram van patiënten met of zonder delier
pie(table(mydata$delier), main="Cirkeldiagram van delier")

Lees meer over het maken van Multiplots.


ggplot2

ggplot2 is een package ontwikkeld door Hadley Wickham en heeft 3 hoofd functies: autoplot(), ggplot() en qplot(). De mogelijkheden van ggplot2 zijn zo uitgebreid dat er boeken over geschreven zijn. Hieronder volgt alleen een kort voorbeeld. ggplot2 werkt volgens het principe dat een plot uit lagen bestaan en dat een grafiek laag voor laag gemaakt kan worden.

Voorbeeld van een plot:

# Laad de package ggplot2
library(ggplot2)

# begin een nieuwe plot
g <- ggplot(mydata, aes(mmse, visus)) 

# verander de kleuren van de punten in het plot op basis van een derde veriabele: delier
g <- g + geom_point(aes(color=factor(mydata$delier)))

# verander de as limieten
g <- g + xlim(c(0,30))      # verander de x-as
g <- g + ylim(c(0,0.75))       # verander de y-as

# voeg een titel en as labels toe
g<- g + labs(x="mmse scores", y="visus", title="MMSE en Visus")

# overdrijven
g <- g + theme(axis.text.x=element_text(angle=50, size=10, vjust=0.5)) # draait de tekst aan de x-as met 50 graden

# einde plot, druk het nu af
print(g)

Meer informatie over ggplot2: ZevRoss cheatsheet (laatste update: 04-02-2015)


Creative Commons-Licentie Dit werk valt onder een Creative Commons Naamsvermelding - Gelijk Delen 3.0 Internationaal-licentie .