Een GGPLOT2 handleiding om mooi te kunnen plotten in R.
De afgelopen maand toch nog weer eens naar datavisualisatie gekeken
en hoe je dat met R het beste kunt doen. Twee boeken nogeens gelezen
hierover. Allereerst het boek van Rob Kabacoff Data Visualization with
R. Het is een handige introducte op ggplot
en vooral een
handige tutorial voor het visualiseren van data met R. Daarnaast het
boek van Clause Wilke Fundamentals of Data
Visualization dat meer een algemene reflectie is op data
visualisatie. Het ga je op verschillende manieren van data naar
visualisatie, wat zijn de onderliggende principes en waaraan moeten we
bij datavisualisatie vooral denken. Toch heb ik de afgelopen maand
vooral veel geleerd van Cédric Scherer. Ik zag dat hij op de conferentie
van R binnenkort een inleiding geeft op het onderwerp datavisualisatie
en zo zag ik via zijn Github site verschillend materiaal over
datavisualisatie. Mooie en duidelijke inleidingen en twee ervan heb ik
in het Nederlands overgezet. Hier vind je in ieder geval een algemene
inleiding op ggplot
. zie
Terug in 2016, moest ik (Cédric vanaf hier) mijn PhD inleidende
lezing voorbereiden en begon ik ggplot2
te gebruiken om
mijn gegevens te visualiseren. Ik hield nooit van de syntaxis en stijl
van basisplots in R, dus ik was snel verliefd op ggplot. Vooral handig
was zijn ‘faceting utility’. Maar omdat ik weinig tijd had, plotte ik
deze figuren met vallen en opstaan en met behulp van veel googlen. De
bron waar ik altijd op terugkwam was een blog post genaamd Beautiful plotting in R: A ggplot2 cheatsheet by Zev Ross,
voor het laatst bijgewerkt in januari 2016.
Na het geven van de lezing, die een aantal fatsoenlijke plots bevatte dankzij de blog post, besloot ik om deze tutorial stap-voor-stap door te nemen. Ik heb er zoveel van geleerd en ben direct begonnen met het aanpassen van de codes. In de loop van de tijd heb ik extra code snippets, grafiektypes en bronnen toegevoegd.
Omdat het blogartikel van Zev Ross al enkele jaren niet meer werd
bijgewerkt en dit stap voor stap een unieke versie van een tutorial
werd, besloot ik om de bijgewerkte versie op mijn GitHub te hosten. Nu
vindt het zijn juiste plaats op deze homepage! (Plus ik heb een groot
aantal updates toegevoegd-om er maar een paar te noemen: - De
fantastische patchwork
, ggtext
en
ggforce
pakketten.
- Hoe om te gaan met aangepaste lettertypen en kleuren.
- Een verzameling van R pakketten op maat gemaakt om interactieve
grafieken te maken.
- En verschillende andere soorten grafieken, waaronder taartdiagrammen
(omdat iedereen van taartdiagrammen houdt.
Grote veranderingen die ik heb aangebracht:
ggplot2
bijhoudt (huidige versie: 3.3.2),een aantal pakketten voor interactieve visualisaties
- {charter}
- {echarts4r}
- {ggiraph}
- {highcharter}
- {plotly}
# Pakketten wel installeren als je ze niet hebt
# Dat kan goed met Pacman, dat moet wel geinstalleerd zijn
pacman::p_load(
tidyverse,
akima,
colorspace,
corrr,
cowplot,
ggdark,
ggforce,
ggiraph,
ggrepel,
ggridges,
ggsci,
ggtext,
ggthemes,
grid,
gridExtra,
hrbrthemes,
patchwork,
rcartocolor,
scico, showtext,
shiny,
plotly,
highcharter,
echarts4r)
(Om pedagogische redenen en als mensen naar een plot springen, laadt Cédric het benodigde pakket naast {ggplot2} in de betreffende sectie).
De studie die we gebruiken is National Morbidity and Mortality Air Pollution Study (NMMAPS). Om de plots hanteerbaar te maken, beperken we de gegevens tot Chicago en 1997-2000. Voor meer details over deze dataset, raadpleeg Roger Peng’s boek Statistical Methods in Environmental Epidemiology with R. Je kunt de gegevens die we in deze tutorial gebruiken hier downloaden (maar dat hoeft niet).
We kunnen de data importeren in onze R sessie, bijvoorbeeld met
read_csv()
uit het readr
pakket. Om later bij
de gegevens te kunnen, slaan we ze op in een variabele genaamd
chic met behulp van de toewijzingspijl:
<-.
chic <- readr::read_csv("https://raw.githubusercontent.com/z3tt/ggplot-courses/main/data/chicago-nmmaps-custom.csv")
De :: wordt naamruimte genoemd en kan worden gebruikt om toegang te krijgen tot een functie zonder het pakket te laden. Hier zou je ook library(readr) eerst kunnen uitvoeren en daarna chic <- read_csv(…).
Laten we zien hoe de dataset eruit ziet.
tibble::glimpse(chic)
Rows: 1,461
Columns: 11
$ city <chr> "chic", "chic", "chic", "chic", "chic", "chic"~
$ date <date> 1997-01-01, 1997-01-02, 1997-01-03, 1997-01-0~
$ temp <dbl> 36.0, 45.0, 40.0, 51.5, 27.0, 17.0, 16.0, 19.0~
$ o3 <dbl> 5.659256, 5.525417, 6.288548, 7.537758, 20.760~
$ dewpoint <dbl> 37.500, 47.250, 38.000, 45.500, 11.250, 5.750,~
$ pm10 <dbl> 13.052268, 41.948600, 27.041751, 25.072573, 15~
$ season <chr> "Winter", "Winter", "Winter", "Winter", "Winte~
$ yday <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,~
$ month <chr> "Jan", "Jan", "Jan", "Jan", "Jan", "Jan", "Jan~
$ month_numeric <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1~
$ year <dbl> 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997~
head(chic, 10)
# A tibble: 10 x 11
city date temp o3 dewpoint pm10 season yday month
<chr> <date> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <chr>
1 chic 1997-01-01 36 5.66 37.5 13.1 Winter 1 Jan
2 chic 1997-01-02 45 5.53 47.2 41.9 Winter 2 Jan
3 chic 1997-01-03 40 6.29 38 27.0 Winter 3 Jan
4 chic 1997-01-04 51.5 7.54 45.5 25.1 Winter 4 Jan
5 chic 1997-01-05 27 20.8 11.2 15.3 Winter 5 Jan
6 chic 1997-01-06 17 14.9 5.75 9.36 Winter 6 Jan
7 chic 1997-01-07 16 11.9 7 20.2 Winter 7 Jan
8 chic 1997-01-08 19 8.68 17.8 33.1 Winter 8 Jan
9 chic 1997-01-09 26 13.4 24 12.1 Winter 9 Jan
10 chic 1997-01-10 16 10.4 5.38 24.8 Winter 10 Jan
# ... with 2 more variables: month_numeric <dbl>, year <dbl>
ggplot2
pakket
ggplot2
is a systeem voor het maken van grafieken gebaseerd op The Grammar of Graphics. Je levert de gegevens aan, verteltggplot2
hoe variabelen af te beelden met een bepaalde esthetiek, welke grafische technieken te gebruiken en het zorgt voor de details.
Een ggplot is opgebouwd uit een paar basis elementen:
geom_
: De geometrische vormen die de
gegevens zullen weergeven.aes()
: Esthetica van de
geometrische en statistische objecten, zoals positie, kleur, grootte,
vorm en transparantie.scale_
: Kaarten tussen de
gegevens en de esthetische dimensies, zoals gegevensbereik naar
plotbreedte of factorwaarden naar kleuren.stat_
:
Statistische samenvattingen van de gegevens, zoals kwantielen, passende
curven, en sommen.coord_
: De
transformatie die wordt gebruikt om gegevenscoördinaten om te zetten in
het vlak van de gegevensrechthoek.facet_
: De ordening van de
gegevens in een raster van plots.theme()
: De algemene
visuele standaardinstellingen van een plot, zoals achtergrond, rasters,
assen, standaard lettertype, afmetingen en kleuren.Het aantal elementen kan variëren, afhankelijk van hoe u ze groepeert en aan wie u het vraagt.
Allereerst, om de functionaliteit van ggplot2
te kunnen
gebruiken, moeten we het pakket laden (dat we ook kunnen laden via tidyverse suite):
De syntax van ggplot2
is anders dan die van
basic R
. Volgens de basiselementen heeft een standaard
ggplot drie dingen nodig die je moet specificeren: de gegevens, de
esthetiek en een geometrie.
We beginnen altijd met het definiëren van een plot-object door
ggplot(data = df)
aan te roepen, wat ggplot2
alleen vertelt dat we met die data gaan werken. In de meeste gevallen
wil je twee variabelen plotten-één op de x-as en één op de y-as. Dit
zijn positie-esthetica en dus voegen we
aes(x = var1, y = var2)
toe aan de ggplot()
aanroep (ja, de aes()
staat voor esthetica). Er zijn echter
ook gevallen waarin men één of zelfs drie of meer variabelen moet
specificeren.
We specificeren de gegevens buiten
aes()
en voegen de variabelen toe waarnaar ggplot de esthetica binnenaes()
tot uitdrukking brengt.
Hier maken we de variabele datum
zichtbaar naar de
x-positie en de variabele temp
naar de y-positie. Later
zullen we ook de variabelen toewijzen aan allerlei andere esthetica
zoals kleur, grootte en vorm.
Hm, alleen een paneel wordt aangemaakt als je dit uitvoert. Waarom?
Dat komt omdat ggplot2
niet weet hoe we de gegevens willen
plotten-we moeten nog een geometrie opgeven!
Met ggplot2
kun je het huidige ggobject
opslaan in een variabele van jouw keuze door het toe te wijzen aan een
variabele, in ons geval genaamd g. Je kunt dit ggobject later uitbreiden
door andere lagen toe te voegen, hetzij allemaal tegelijk of door het
toe te wijzen aan dezelfde of een andere variabele.
Door haakjes te gebruiken tijdens het toewijzen van een object, zal het object onmiddellijk worden afgedrukt (in plaats van
g <- ggplot(...)
en dang
te schrijven schrijven we gewoon(g <- ggplot(...)))
.
Er zijn vele, vele verschillende geometrieën (geoms genoemd
omdat elke functie gewoonlijk begint met geom_
) die je
standaard aan een ggplot kunt toevoegen (zie hier voor een volledige
lijst) en nog meer die door uitbreidingspakketten worden aangeboden (zie
hier voor een
verzameling van uitbreidingspakketten). Laten we ggplot2
vertellen welke stijl we willen gebruiken, bijvoorbeeld door
geom_pint()
toe te voegen om een scatter plot te maken:
g + geom_point()
Nooi! Maar deze data kunnen ook gevisualiseerd worden als een
lijnplot (niet optimaal, maar mensen doen dit soort dingen de hele
tijd). Dus voegen we simpelweg geom_line()
toe en
voilá:
g + geom_line()
Je kunt ook verschillende geometrische lagen combineren - en dit is waar de magie en het plezier begint!
g + geom_line() + geom_point()
Dat is het voor nu over geometrieën. Geen zorgen, we gaan later nog verschillende plot types leren.
Binnen het geom_
* commando, kun je al visuele esthetiek
manipuleren, zoals de kleur, vorm, en grootte van je punten. Laten we
alle punten in grote vuurrode diamanten veranderen!
g + geom_point(color = "firebrick", shape = "diamond", size = 2)
ggplot2
begrijpt zowel color als colour als de korte versie col.
*Je kunt voorgedefinieerde kleuren gebruiken (hier is een volledige
lijst) of hex-kleurcodes,
en zelfs RGB/RGBA kleuren gebruiken met rgb()
functie.
Elke geom komt met z’n eigen eigenschappen (genoemd
arguments) en hetzelfde argument kan in iets anders veranderen
afhankelijk van de geom
die je gebruikt.
g + geom_point(color = "firebrick", shape = "diamond", size = 2) +
geom_line(color = "firebrick", linetype = "dotted", size = .3)
ggplot2
-themaEn om nog wat meer van ggplot’s veelzijdigheid te illustreren, laten
we ons ontdoen van het grijzige standaard ggplot2
uiterlijk
door een ander ingebouwd thema in te stellen, b.v.
theme_bw()
-door theme_set()
op te roepen
zullen alle volgende plots hetzelfde zwart-wit thema hebben. De rode
punten zien er nu veel beter uit!
theme_set(theme_bw())
g + geom_point(color = "firebrick")
Meer informatie over het gebruik van ingebouwde thema’s en het aanpassen van thema’s vind je in “Working with Themes”. Vanaf het volgende hoofdstuk, zullen we ook de theme() functie gebruiken om bepaalde elementen van het thema aan te passen.
theme()
is een essentieel commando om handmatig allerlei thema-elementen (teksten, rechthoeken, en lijnen) aan te passen.
Om te zien welke details van een ggplot thema kunnen worden aangepast, kijk hier - en neem even de tijd, dit is een lange lijst.
Laten we wat goed geschreven labels toevoegen aan de assen. Hiervoor
voegen we labs()
toe met een tekenreeks voor elk label dat
we willen veranderen (hier x
en y
):
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)")
Je kunt ook elke astitel toevoegen via xlab()
en
ylab()
. *
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
xlab("Jaar") +
ylab("Temperatuur (°F)")
Normaal kan je ook symbolen specificeren door gewoon het symbool zelf toe te voegen, maar onderstaande code laat ook toe om niet alleen symbolen toe te voegen, maar bv. superscripts:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = expression(paste("Temperatuur (", degree ~ F, ")"^"(Hey, waarom zouden we metrische eenheden gebruiken?!)")))
theme()
is een essentieel commando om bepaalde
thema-elementen aan te passen (teksten en titels, kaders, symbolen,
achtergronden, …). We gaan ze veel gebruiken! Voor nu gaan we
tekstelementen wijzigen. We kunnen de eigenschappen van alle of bepaalde
tekstelementen (hier as-titels) wijzigen door het overschrijven van het
standaard element_text()
binnen de theme()
aanroep:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(axis.title.x = element_text(vjust = 0, size = 15),
axis.title.y = element_text(vjust = 2, size = 15))
vjust
verwijst naar de verticale uitlijning, die
gewoonlijk tussen 0 en 1 ligt, maar je kunt ook waarden buiten dat
bereik opgeven. Merk op dat, hoewel we de as-titel op de y-as
horizontaal verplaatsen, we vjust
moeten specificeren (wat
correct is vanuit het perspectief van het label). Je kunt de afstand ook
veranderen door de marge van beide tekst elementen op te geven:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(axis.title.x = element_text(margin = margin(t = 10), size = 15),
axis.title.y = element_text(margin = margin(r = 10), size = 15))
De labels t
en r
in het
margin()
object verwijzen naar boven en
rechts, respectievelijk. Je kunt de vier marges ook opgeven als
margin(t, r, b, l)
. Merk op dat we nu de rechtermarge
moeten veranderen om de ruimte op de y-as aan te passen, niet de
ondermarge.
Een goede manier om de volgorde van de marges te onthouden is “t-r-ou-b-l-e”.
We gebruiken weer de theme()
functie en wijzigen het
element axis.title
en/of de ondergeschikte elementen
axis.title.x
en axis.title.y
. Binnen de
element_text() kunnen we bijvoorbeeld de standaardwaarden voor
size
, color
, en face
overschrijven:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(axis.title = element_text(size = 15, color = "firebrick",
face = "italic"))
Het face
argument kan worden gebruikt om het lettertype
vet or schuin of zelfd
bold.italic(vet.schuin) te krijgen.
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(axis.title.x = element_text(color = "sienna", size = 15),
axis.title.y = element_text(color = "orangered", size = 15))
Je kunt ook een combinatie gebruiken van
axis.title
enaxis.title.y
, omdataxis.title.x
de waarden erft vanaxis.title
. Zie hieronder.
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(axis.title = element_text(color = "sienna", size = 15),
axis.title.y = element_text(color = "orangered", size = 15))
Men kan sommige eigenschappen voor beide assen wijzigen en andere slechts voor één of eigenschappen voor elke as afzonderlijk:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(axis.title = element_text(color = "sienna", size = 15, face = "bold"),
axis.title.y = element_text(face = "bold.italic"))
Op dezelfde manier kun je ook het uiterlijk van de as-tekst (hier
de getallen) veranderen door axis.text
en/of de
ondergeschikte elementen axis.text.x
en
axis.text.y
te gebruiken:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(axis.text = element_text(color = "dodgerblue", size = 12),
axis.text.x = element_text(face = "italic"))
Door een angle
op te geven kun je alle tekstelementen
draaien. Met hjust
en vjust
kun je de positie
van de tekst achteraf horizontaal (0 = left, 1 = right) en verticaal (0
= top, 1 = bottom) aanpassen:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Year", y = "Temperature (°F)") +
theme(axis.text.x = element_text(angle = 50, vjust = 1, hjust = 1, size = 12))
Er zal niet snel een reden voor zijn—maar zo werkt het:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(axis.ticks.y = element_blank(),
axis.text.y = element_blank())
Ik heb drie thema-elementen geïntroduceerd - tekst, lijnen en
rechthoeken - maar eigenlijk is er nog een: element_blank()
dat het element verwijdert (en dus niet als een officieel element wordt
beschouwd).
Als je van een
theme
-element af wilt, is het element altijdelement_blank()
.
We zouden opnieuw theme_blank()
kunnen gebruiken, maar
het is veel eenvoudiger om gewoon het label te verwijderen in de
labs()
(of xlab()
) aanroep:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = NULL, y = "")
Merk op dat
NULL
het element verwijdert (vergelijkbaar metelement_blank()
) terwijl lege aanhalingstekens""
de spatiëring voor de as-titel behouden en gewoon niets afdrukken.
Soms wil je een bepaald bereik van je gegevens nader bekijken. Je kunt dit doen zonder je gegevens te splitsen:
Als alternatief kun je
scale_y_continuous(limits = c(0, 50))
of
coord_cartesian(ylim = c(0, 50))
gebruiken. De eerste
verwijdert alle datapunten buiten het bereik, terwijl de tweede het
zichtbare gebied aanpast en vergelijkbaar is met
ylim(c(0, 50))
. Je kunt je afvragen: Dus uiteindelijk
leveren beide hetzelfde op. Niet echt, er is een belangrijk
verschil-vergelijk de twee volgende plots:
Plaatje2.PNG)
Je hebt misschien gezien dat er links een lege buffer is rond de y-grens, terwijl er rechts punten tot aan de grens en zelfs verder worden uitgezet. Dit illustreert perfect het subsetting (links) versus het zoomen (rechts). Om te tonen waarom dit belangrijk is, laten we eens kijken naar een ander grafiektype, een box plot:
Omdat scale_x|y_continuous()
de data eerst subset,
krijgen we totaal verschillende (en verkeerde, tenminste als dit niet je
doel was) schattingen voor de boxp-lots! Ik hoop dat je nu niet terug
hoeft te gaan naar je oude scripts om te controleren of je misschien je
data hebt gemanipuleerd tijdens het plotten en verkeerde samenvattende
statistieken hebt gerapporteerd in je rapport, paper of thesis…
Verwant hiermee, je kan R forceren om de grafiek te plotten startend bij de oorsprong:
library(tidyverse)
chic_high <- dplyr::filter(chic, temp > 25, o3 > 20)
ggplot(chic_high, aes(x = temp, y = o3)) +
geom_point(color = "darkcyan") +
labs(x = "Temperatuur hoger dan 25°F",
y = "Ozon hoger dan 20 ppb") +
expand_limits(x = 0, y = 0)
Gebruik van
coord_cartesian(xlim = c(0, NA), ylim = c(0, NA))
levert hetzelfde resultaat op.
library(tidyverse)
chic_high <- dplyr::filter(chic, temp > 25, o3 > 20)
ggplot(chic_high, aes(x = temp, y = o3)) +
geom_point(color = "darkcyan") +
labs(x = "Temperatuur hoger dan25°F",
y = "Ozon hoger dan 20 ppb") +
coord_cartesian(xlim = c(0, NA), ylim = c(0, NA))
Maar we kunnen het ook forceren om letterlijk bij het begin te beginnen.
ggplot(chic_high, aes(x = temp, y = o3)) +
geom_point(color = "darkcyan") +
labs(x = "Temperatuur hoger dan 25°F",
y = "Ozon hoger dan 20 ppb") +
expand_limits(x = 0, y = 0) +
coord_cartesian(expand = FALSE, clip = "off")
Het argument
clip = "off"
in elk coördinatensysteem, altijd beginnend metcoord_*
, stelt je in staat om buiten het paneelgebied te tekenen.
Hier zorg ik ervoor dat de tikmerken op c(0, 0) niet weggesneden worden. Voor meer details zie ook Twitter thread door Claus Wilke.
Laten we ter demonstratie de temperatuur uitzetten tegen de
temperatuur met wat willekeurige ruis. De coord_equal()
is
een coördinatensysteem met een gespecificeerde verhouding die het aantal
eenheden op de y-as weergeeft dat gelijk is aan één eenheid op de
x-as.
De standaardwaarde, ratio = 1
, zorgt ervoor dat één
eenheid op de x-as even lang is als één eenheid op de y-as:
Verhoudingen hoger dan één maken eenheden op de y-as langer dan eenheden op de x-as, en omgekeerd:
Soms is het handig om uw labels een beetje te wijzigen, bijvoorbeeld door eenheden of procenttekens toe te voegen zonder ze aan uw gegevens toe te voegen. In dat geval kun je een functie gebruiken:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = NULL) +
scale_y_continuous(label = function(x) {return(paste(x, "Graden Fahrenheit"))})
We kunnen een titel toevoegen via de ggtitle()
functie:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
ggtitle("Temperaturen in Chicago")
Als alternatief kun je labs()
gebruiken. Hier kun je
meerdere argumenten toevoegen, bijvoorbeeld een ondertitel, een
onderschrift en een tag (en ook as-titels zoals eerder getoond):
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)",
title = "Temperaturen in Chicago",
subtitle = "Seizoenspatroon van dagelijkse temperaturen van 1997 tot 2001",
caption = "Data: NMMAPS",
tag = "Figuur 1")
Nogmaals, omdat we de eigenschappen van een themaelement willen
wijzigen, gebruiken we de theme()
functie en zoals voor de
tekstelementen axis.title
en axis.text
wijzigen we het lettertype en de marge. Alle volgende wijzigingen van
thema-elementen werken niet alleen voor de titel, maar voor alle andere
labels zoals
plot.subtitle, plot.caption, plot.caption, legend.title, legend.text
,
axis.title
en axis.text
.
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)",
title = "Temperaturen in Chicago") +
theme(plot.title = element_text(face = "bold",
margin = margin(10, 0, 10, 0),
size = 14))
Een mooie manier om de volgorde van de marge-argumenten te onthouden is “t-r-oub-l-e”.
De algemene uitlijning (links, midden, rechts) wordt geregeld met
hjust
(dat staat voor horizontale aanpassing):
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Year", y = NULL,
title = "Temperaturen in Chicago",
caption = "Data: NMMAPS") +
theme(plot.title = element_text(hjust = 1, size = 16, face = "bold.italic"))
Natuurlijk is het daar ook mogelijk om de verticale uitlijning aan te
passen, geregeld door vjust
.
De gebruiker de uitlijning van de titel, ondertitel en bijschrift
opgeven op basis van het paneelgebied (de standaard) of de plotmarge via
plot.title.position
en plot.caption.position
.
De laatste optie is in de meeste gevallen de betere keuze en veel mensen
waren erg blij met deze nieuwe functie, omdat met name bij zeer lange
y-as labels de uitlijning er verschrikkelijk uitziet:
(g <- ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
scale_y_continuous(label = function(x) {return(paste(x, "Graden Fahrenheit"))}) +
labs(x = "Jaar", y = NULL,
title = "Temperaturen in Chicago 1997-2001
in Graden Fahrenheit",
caption = "Data: NMMAPS") +
theme(plot.title = element_text(size = 14, face = "bold.italic"),
plot.caption = element_text(hjust = 0)))
g + theme(plot.title.position = "plot",
plot.caption.position = "plot")
Je kunt ook verschillende lettertypes gebruiken, niet alleen het
standaard lettertype dat door ggplot wordt geleverd (en dat verschilt
van besturingssysteem tot besturingssysteem). Er zijn verschillende
pakketten die je helpen om lettertypes te gebruiken die op je machine
geïnstalleerd zijn (en die je misschien gebruikt in je office
programma). Hier gebruik ik het showtext
pakket dat het
makkelijk maakt om verschillende types lettertypes (TrueType, OpenType,
Type 1, web fonts, etc.) te gebruiken in R plots. Nadat we het pakket
hebben geladen, moet je het lettertype importeren dat ook op je apparaat
moet zijn geïnstalleerd. Ik gebruik regelmatig Google fonts dat geïmporteerd kan
worden met de functie font_add_google()
maar je kunt ook
andere lettertypen toevoegen met font_add()
. (Merk op dat
zelfs in het geval van het gebruik van Google fonts je het font moet
installeren - en Rstudio opnieuw moet opstarten - om het font te kunnen
gebruiken).
library(showtext)
font_add_google("Playfair Display", ## name of Google font
"Playfair") ## name that will be used in R
font_add_google("Bangers", "Bangers")
Nu kunnen we die lettertype families gebruiken met - ja, je raadt het
al - theme()
:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)",
title = "Temperaturen in Chicago",
subtitle = "Dagelijkese temperaturen in °F van 1997 tot 2001") +
theme(plot.title = element_text(family = "Bangers", hjust = .5, size = 25),
plot.subtitle = element_text(family = "Playfair", hjust = .5, size = 15))
Je kunt ook een niet-standaard lettertype instellen voor alle tekstelementen van jouw plots, voor meer details zie “Working with themes”. Ik ga Roboto Condensed gebruiken als het nieuwe lettertype voor alle volgende plots.
font_add_google("Roboto Condensed", "Roboto Condensed")
theme_set(theme_bw(base_size = 12, base_family = "Roboto Condensed"))
(Voorheen gebruikte deze handleiding het extrafont
pakket, dat het tot vorig jaar prima deed. Plotseling kon ik geen nieuwe
lettertypen meer toevoegen en nadat ik een nieuwe laptop had, vond het
pakket helemaal geen lettertypen meer… Ik stel nu meestal het
ragg
pakket voor. Het is me echter niet gelukt om het te
laten werken voor mijn homepage dus gebruik ik het showtext
pakket dat ook geweldig is met het enige verschil dat je het lettertype
dat je wilt gebruiken expliciet moet importeren met
showtext
. Het lijkt er echter op dat er enkele
technische details zijn die niet optimaal door showtext
worden opgelost, zodat je het pakket misschien als allerlaatste
redmiddel wilt gebruiken.).
Je kunt het lineheight
argument gebruiken om de afstand
tussen de regels te veranderen. In dit voorbeeld, heb ik de regels
samengeknepen (lineheight < 1).
Je kunt het lineheight
argument gebruiken om de afstand
tussen de regels te veranderen. In dit voorbeeld, heb ik de regels
samengeknepen (lineheight < 1).
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Year", y = "Temperature (°F)") +
ggtitle("Temperatures in Chicago\nfrom 1997 to 2001") +
theme(plot.title = element_text(lineheight = .8, size = 16))
We zullen de plot een kleurcode geven op basis van het seizoen. Of om
het op een meer ggplot-achtige manier te zeggen: we koppelen de
variabele season
aan de aes
thetic
color
. Een leuke eigenschap van ggplot2
is dat
het standaard een legenda toevoegt wanneer het een variabele aan een
esthetiek koppelt. Je kunt zien dat de titel van de legenda standaard is
wat we in het kleur argument hebben opgegeven:
ggplot(chic,
aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)")
Een van de eerste vragen is vaak: “Hoe kan ik de legenda uitzetten?”.
Het is vrij eenvoudig en werkt altijd met
theme(legend.position = "none")
:
ggplot(chic,
aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(legend.position = "none")
Je kunt ook guides(color = "none")
of
scale_color_discrete(guide = "none")
gebruiken, afhankelijk
van het specifieke geval. Terwijl de verandering van het thema-element
alle legenda’s in een keer verwijdert, kunt je met de laatstgenoemde
opties bepaalde legenda’s verwijderen terwijl sommige andere behouden
blijven:
ggplot(chic,
aes(x = date, y = temp,
color = season, shape = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
guides(color = "none")
Hier, bijvoorbeeld, behouden we de legende voor de vormen terwijl we die voor de kleuren weggooien.
Zoals we al geleerd hebben, gebruik element_blank()
om
niets te tekenen:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(legend.title = element_blank())
Je kunt hetzelfde bereiken door de legendanaam op NULL te zetten, ofwel via
scale_color_discrete(name = NULL)
oflabs(color = NULL)
.
Als men de legenda niet rechts wil plaatsen, gebruikt men
legend.position
als argument in theme
.
Mogelijke posities zijn “boven”, “rechts” (wat de standaard is),
“onder”, en “links”.You can achieve the same by setting the legend name
to NULL, either via scale_color_discrete(name = NULL)
or
labs(color = NULL)
.
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(legend.position = "top")
Je kunt de legenda ook binnen het paneel plaatsen door een vector op
te geven met relatieve x
en y
coördinaten
variërend van 0 (links of onder) tot 1 (rechts of boven):
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)",
color = NULL) +
theme(legend.position = c(.15, .15),
legend.background = element_rect(fill = "transparent"))
Hier overschrijf ik ook de standaard witte legende achtergrond met een transparante vulling om er zeker van te zijn dat de legende geen data punten verbergt.
Zoals je gezien hebt, is de legende-richting standaard verticaal, maar horizontaal als je de “top” of “bottom” positie kiest. Maar u kunt de richting ook veranderen zoals u wilt:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(legend.position = c(.5, .97),
legend.background = element_rect(fill = "transparent")) +
guides(color = guide_legend(direction = "horizontal"))
U kunt het uiterlijk van de legendatitel veranderen door het
thema-element legend.title
aan te passen:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(legend.title = element_text(family = "Playfair",
color = "chocolate",
size = 14, face = "bold"))
De eenvoudigste manier om de titel van de legenda te veranderen is de
labs()
laag:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)",
color = "Seizoenen\ngeïndiceerd\ndoor kleuren:") +
theme(legend.title = element_text(family = "Playfair",
color = "chocolate",
size = 14, face = "bold"))
De legenda details kunnen worden veranderd via
scale_color_discrete(name = "title")
of
guides(color = guide_legend("title"))
:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(legend.title = element_text(family = "Playfair",
color = "chocolate",
size = 14, face = "bold")) +
scale_color_discrete(name = "Seizoenen\ngeïndiceerd\ndoor kleuren:")
We kunnen dit bereiken door de niveaus van season
te
veranderen:
We gaan de seizoenen vervangen door de maanden die ze bestrijken door
een vector van namen op te geven in de
scale_color_discrete()
aanroep:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
scale_color_discrete(
name = "Seasons:",
labels = c("Mar—May", "Jun—Aug", "Sep—Nov", "Dec—Feb")
) +
theme(legend.title = element_text(
family = "Playfair", color = "chocolate", size = 14, face = 2
))
Om de achtergrondkleur (vulling) van de legenda toetsen te
veranderen, passen we de instelling voor het thema element
legend.key
aan:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Year", y = "Temperature (°F)") +
theme(legend.key = element_rect(fill = "darkgoldenrod1"),
legend.title = element_text(family = "Playfair",
color = "chocolate",
size = 14, face = 2)) +
scale_color_discrete("Seasons:")
Als je ze helemaal weg wilt hebben, gebruik dan
fill = NA
of fill = "transparent"
.
Punten in de legenda kunnen een beetje verloren gaan met de standaard
grootte, vooral zonder de kaders. Om de standaardgrootte op te heffen
gebruikt men weer de guides
laag zoals hier:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(legend.key = element_rect(fill = NA),
legend.title = element_text(color = "chocolate",
size = 14, face = 2)) +
scale_color_discrete("Seasons:") +
guides(color = guide_legend(override.aes = list(size = 6)))
Laten we zeggen dat je twee verschillende geoms hebt gemapt op dezelfde variabele. Bijvoorbeeld, kleur als esthetiek voor zowel een puntlaag als een tapijtlaag van dezelfde gegevens. Standaard komen zowel de punten als de “lijn” zo in de legenda terecht:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
geom_rug()
Je kunt show.legend = FALSE
gebruiken om een laag in de
legenda uit te schakelen:
ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)") +
geom_rug(show.legend = FALSE)
ggplot2
voegt niet automatisch een legenda toe, tenzij
je de esthetiek (kleur, grootte etc.) aan een variabele koppelt. Er zijn
echter momenten dat ik een legenda wil hebben, zodat het duidelijk is
wat je aan het plotten bent.
Hier is de standaard:
ggplot(chic, aes(x = date, y = o3)) +
geom_line(color = "gray") +
geom_point(color = "darkorange2") +
labs(x = "Jaar", y = "Ozon")
We kunnen een legenda forceren door een leidraad naar een
variabele te mappen. We mappen de lijnen en de punten met
aes()
en we mappen niet naar een variabele
in onze dataset, maar naar een enkele string (zodat we voor elk maar één
kleur krijgen).
ggplot(chic, aes(x = date, y = o3)) +
geom_line(aes(color = "line")) +
geom_point(aes(color = "points")) +
labs(x = "Jaar", y = "Ozon") +
scale_color_discrete("Type:")
We komen in de buurt, maar dit is niet wat we willen. We willen grijs
en rood! Om de kleur te veranderen, gebruiken we
scale_color_manual()
. Daarnaast veranderen we de legenda
met de guide()
functie.
Voila! We hebben nu een plot met grijze lijnen en rode punten, en een enkele grijze lijn en een enkel rood punt als legenda symbolen:
ggplot(chic, aes(x = date, y = o3)) +
geom_line(aes(color = "line")) +
geom_point(aes(color = "points")) +
labs(x = "Jaar", y = "Ozon") +
scale_color_manual(name = NULL,
guide = "legend",
values = c("points" = "darkorange2",
"line" = "gray")) +
guides(color = guide_legend(override.aes = list(linetype = c(1, 0),
shape = c(NA, 16))))
De standaard-legenda voor categorische variabelen zoals
season
is een guide_legend()
zoals je in
verschillende eerdere voorbeelden hebt gezien. Als je een continue
variabele mapt naar een esthetiek, zal ggplot2
standaard
geen guide_legend()
gebruiken maar
guide_colorbar()
(of guide_colourbar()
):
ggplot(chic,
aes(x = date, y = temp, color = temp)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)", color = "Temperatuur (°F)")
Echter, door guide_legend()
te gebruiken kun je de
legenda dwingen om discrete kleuren te tonen voor een gegeven aantal
breuken zoals in het geval van een categorische variabele:
ggplot(chic,
aes(x = date, y = temp, color = temp)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)", color = "Temperatuur (°F)") +
guides(color = guide_legend())
Je kunt ook binned scales gebruiken:
ggplot(chic,
aes(x = date, y = temp, color = temp)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)", color = "Temperatuur (°F)") +
guides(color = guide_bins())
… of schalen als discrete colorbars:
ggplot(chic,
aes(x = date, y = temp, color = temp)) +
geom_point() +
labs(x = "Jaar", y = "Temperatuur (°F)", color = "Temperatuur (°F)") +
guides(color = guide_colorsteps())
Er zijn manieren om het hele uiterlijk van uw plot te veranderen met één functie (zie “Working with themes” sectie hieronder) maar als je alleen de kleuren van sommige elementen wilt veranderen, kunt je dat ook doen.
Om de achtergrondkleur (vulling) van het paneelgebied (d.w.z. het
gebied waar de gegevens worden uitgezet) te veranderen, moet het
thema-element panel.background
worden aangepast:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "#1D8565", size = 2) +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(panel.background = element_rect(
fill = "#64D2AA", color = "#64D2AA", size = 2)
)
Merk op dat de echte kleur - de omtrek van de achtergrond van het
paneel - niet verandert, ook al hebben we die gespecificeerd. Dit komt
omdat er een laag bovenop de panel.background
zit, namelijk
panel.border
. Zorg er wel voor dat je hier een transparante
vulling gebruikt, anders worden je gegevens verborgen achter deze laag.
In het volgende voorbeeld illustreer ik dat door een semitransparante
hex kleur te gebruiken voor het fill
argument in
element_rect
:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "#1D8565", size = 2) +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(panel.border = element_rect(
fill = "#64D2AA99", color = "#64D2AA", size = 2))
Er zijn twee soorten rasterlijnen: grote rasterlijnen die de vinkjes
aangeven en kleine rasterlijnen tussen de grote rasterlijnen. Je kunt
deze allemaal veranderen door de standaardwaarden voor
panel.grid
te overschrijven of voor elke set rasterlijnen
afzonderlijk, panel.grid.major
en
panel.grid.minor
.
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(panel.grid.major = element_line(color = "gray10", size = .5),
panel.grid.minor = element_line(color = "gray70", size = .25))
Je kunt zelfs instellingen opgeven voor de vier verschillende niveaus:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(panel.grid.major = element_line(size = .5, linetype = "dashed"),
panel.grid.minor = element_line(size = .25, linetype = "dotted"),
panel.grid.major.x = element_line(color = "red1"),
panel.grid.major.y = element_line(color = "blue1"),
panel.grid.minor.x = element_line(color = "red4"),
panel.grid.minor.y = element_line(color = "blue4"))
En natuurlijk kun je sommige of alle rasterlijnen verwijderen als je dat wilt:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(panel.grid.minor = element_blank())
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(panel.grid = element_blank())
Bovendien kun je ook de onderbrekingen tussen de grote en kleine rasterlijnen bepalen:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
scale_y_continuous(breaks = seq(0, 100, 10),
minor_breaks = seq(0, 100, 2.5))
Op dezelfde manier, om de achtergrondkleur (vulling) van het plot
gebied te veranderen, moet men het theme element
plot.background
aanpassen:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(plot.background = element_rect(fill = "gray60",
color = "gray30", size = 2))
Je kunt een unieke achtergrondkleur krijgen door ofwel dezelfde
kleuren in panel.background
en plot.background
te zetten, of door de achtergrondvulling van het paneel op
"transparent"
of NA
te zetten:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(panel.background = element_rect(fill = NA),
plot.background = element_rect(fill = "gray60",
color = "gray30", size = 2))
Soms is het handig om een beetje ruimte toe te voegen aan de
plotmarge. Net als bij de vorige voorbeelden kunnen we een argument
gebruiken voor de theme()
functie. In dit geval is het
argument plot.margin
. Zoals in het vorige voorbeeld hebben
we de standaard marge al geïllustreerd door de achtergrondkleur te
veranderen met plot.background
.
Laten we nu extra ruimte toevoegen aan zowel links als rechts. Het
argument, plot.margin
, kan overweg met verschillende
eenheden (cm, inches, etc.) maar vereist het gebruik van de functie unit
uit het pakket grid
om de eenheden te specificeren. Je kunt
ofwel dezelfde waarde opgeven voor alle zijden (het makkelijkst via
rep(x, 4))
of bepaalde afstanden voor elk. Hier gebruik ik
een marge van 1 cm aan de boven- en onderkant, 3 cm marge aan de
rechterkant, en 8 cm marge aan de linkerkant.
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(plot.background = element_rect(fill = "gray60"),
plot.margin = margin(t = 1, r = 3, b = 1, l = 8, unit = "cm"))
De volgorde van de margezijden is boven, rechts, onder, links-een mooie manier om deze volgorde te onthouden is “trouble dat sorteert de eerste letter van de vier zijden.
Je kunt ook
unit()
gebruiken in plaats vanmargin()
.
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "firebrick") +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(plot.background = element_rect(fill = "gray60"),
plot.margin = unit(c(1, 3, 1, 8), "cm"))
Het ggplot2
pakket heeft twee mooie functies voor het
maken van multi-panel plots, facets genaamd. Ze zijn verwant maar een
beetje verschillend: facet_wrap
creëert in wezen een lint
van plots gebaseerd op een enkele variabele terwijl
facet_grid
een raster van twee variabelen overspant.
In het geval van twee variabelen, doet facet_grid
het
werk. Hier bepaalt de volgorde van de variabelen het aantal rijen en
kolommen:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "orangered", alpha = .3) +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
labs(x = "Jaar", y = "Temperatuur (°F)") +
facet_grid(year ~ season)
Om van rij- naar kolomindeling te veranderen kun je
facet_grid(year ~ season)
veranderen in
facet_grid(season ~ year)
.
facet_wrap
maakt een facet van een enkele variabele,
geschreven met een tilde ervoor: facet_wrap(~ variable)
.
Het uiterlijk van deze subplots wordt geregeld door de argumenten
ncol
en nrow
:
g <-
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "chartreuse4", alpha = .3) +
labs(x = "Jaar", y = "Temperatuur (°F)") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))
g + facet_wrap(~ year)
Dienovereenkomstig kunt je de plots rangschikken zoals je wilt, in plaats van als een matrix in één rij…
g + facet_wrap(~ year, nrow = 1)
… of zelfs als een asymmetrisch raster van percelen:
g + facet_wrap(~ year, ncol = 3) + theme(axis.title.x = element_text(hjust = .15))
De standaard voor multi-panel plots in ggplot2
is om
gelijkwaardige schalen te gebruiken in elk paneel. Maar soms wil je
toestaan dat de gegevens van een paneel zelf de schaal bepalen. Dit is
vaak geen goed idee omdat het de gebruiker een verkeerde indruk kan
geven over de data. Maar soms is het wel degelijk nuttig en om dit te
doen kunt u scales = "free"
instellen:
g + facet_wrap(~ year, nrow = 2, scales = "free")
Merk op dat zowel de x-as als de y-as verschillen in hun bereik!
facet_wrap
met twee variabelenDe functie facet_wrap
kan ook twee variabelen
aannemen:
g + facet_wrap(year ~ season, nrow = 4, scales = "free_x")
Bij het gebruik van facet_wrap
heeft u nog steeds
controle over het ontwerp van het grid: u kunt het aantal plots per rij
en kolom herschikken en u kunt ook alle assen vrij laten rondlopen. In
tegenstelling hiermee neemt facet_grid
ook een
free
argument, maar laat het alleen per kolom of rij vrij
rondlopen:
g + facet_grid(year ~ season, scales = "free_x")
Door thema
te gebruiken, kunt u het uiterlijk van de
strook tekst (d.w.z. de titel voor elk facet) en de strook tekstvakken
wijzigen:
g + facet_wrap(~ year, nrow = 1, scales = "free_x") +
theme(strip.text = element_text(face = "bold", color = "chartreuse4",
hjust = 0, size = 20),
strip.background = element_rect(fill = "chartreuse3", linetype = "dotted"))
De volgende two
functions adapted from this answer by Claus Wilke, maakt de auteur
van het ggtext
pakket het mogelijk om specifieke labels te
markeren in combinatie met element_textbox()
dat wordt
geleverd door ggtext
.
library(ggtext)
library(rlang)
element_textbox_highlight <- function(..., hi.labels = NULL, hi.fill = NULL,
hi.col = NULL, hi.box.col = NULL, hi.family = NULL) {
structure(
c(element_textbox(...),
list(hi.labels = hi.labels, hi.fill = hi.fill, hi.col = hi.col, hi.box.col = hi.box.col, hi.family = hi.family)
),
class = c("element_textbox_highlight", "element_textbox", "element_text", "element")
)
}
element_grob.element_textbox_highlight <- function(element, label = "", ...) {
if (label %in% element$hi.labels) {
element$fill <- element$hi.fill %||% element$fill
element$colour <- element$hi.col %||% element$colour
element$box.colour <- element$hi.box.col %||% element$box.colour
element$family <- element$hi.family %||% element$family
}
NextMethod()
}
Nu kun je het gebruiken en bijvoorbeeld alle strookteksten opgeven:
g + facet_wrap(year ~ season, nrow = 4, scales = "free_x") +
theme(
strip.background = element_blank(),
strip.text = element_textbox_highlight(
family = "Playfair", size = 12, face = "bold",
fill = "white", box.color = "chartreuse4", color = "chartreuse4",
halign = .5, linetype = 1, r = unit(5, "pt"), width = unit(1, "npc"),
padding = margin(5, 0, 3, 0), margin = margin(0, 1, 3, 1),
hi.labels = c("1997", "1998", "1999", "2000"),
hi.fill = "chartreuse4", hi.box.col = "black", hi.col = "white"
)
)
ggplot(chic, aes(x = date, y = temp)) +
geom_point(aes(color = season == "Summer"), alpha = .3) +
labs(x = "Jaar", y = "Temperatuur (°F)") +
facet_wrap(~ season, nrow = 1) +
scale_color_manual(values = c("gray40", "firebrick"), guide = "none") +
theme(
axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
strip.background = element_blank(),
strip.text = element_textbox_highlight(
size = 12, face = "bold",
fill = "white", box.color = "white", color = "gray40",
halign = .5, linetype = 1, r = unit(0, "pt"), width = unit(1, "npc"),
padding = margin(2, 0, 1, 0), margin = margin(0, 1, 3, 1),
hi.labels = "Summer", hi.family = "Bangers",
hi.fill = "firebrick", hi.box.col = "firebrick", hi.col = "white"
)
)
Er zijn verschillende manieren om plots te combineren. De
makkelijkste aanpak is volgens mij het patchwork
package van Thomas Lin
Pedersen:
We kunnen de volgorde veranderen door beide plots te “verdelen” (en let op de uitlijning, ook al heeft de ene een legende en de andere niet!):
p1 / p2
En ook geneste plots zijn mogelijk!
(g + p2) / p1
(Let op de uitlijning van de plots, hoewel slechts één plot een legenda heeft).
Als alternatief biedt het cowplot
package
van Claus Wilke de functionaliteit om meerdere plots te combineren (en
vele andere goede utilities):
… en ook doet gridExtra
package
het goed:
library(gridExtra)
grid.arrange(g, p1, p2,
layout_matrix = rbind(c(1, 2), c(3, 3)))
Hetzelfde idee van het definiëren van een lay-out kan worden gebruikt
met patchwork
, waarmee complexe composities kunnen worden
gemaakt:
layout <- "
AABBBB#
AACCDDE
##CCDD#
##CC###
"
p2 + p1 + p1 + g + p2 +
plot_layout(design = layout)
Voor eenvoudige toepassingen is het werken met kleuren in
ggplot2
rechttoe rechtaan. Voor een meer gevorderde
behandeling van het onderwerp moet je waarschijnlijk Hadley’s boek
aanschaffen, dat een goede dekking heeft. Andere goede bronnen zijn het
R Cookbook en de `color sectie in de R Graph Gallery door Yan
Holtz.
Er zijn twee belangrijke verschillen als het gaat om kleuren in
ggplot2
. Beide argumenten, color
en
fill
, kunnen
Zoals je in het begin van deze tutorial al hebt gezien, worden
variabelen die binnen de aes
thetiek vallen
gecodeerd door variabelen en die erbuiten vallen zijn eigenschappen die
niets met de variabelen te maken hebben. Deze complete nonsens plot met
het aantal records per jaar en seizoen illustreert dat feit:
Statische, enkele kleuren zijn eenvoudig te gebruiken. We kunnen een enkele kleur specificeren voor een geom:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "steelblue", size = 2) +
labs(x = "Jaar", y = "Temperatuur (°F)")
… en in het geval dat het beide biedt, een color
(omtrekkleur) en een fill
(vulkleur):
ggplot(chic, aes(x = date, y = temp)) +
geom_point(shape = 21, size = 2, stroke = 1,
color = "#3cc08f", fill = "#c08f3c") +
labs(x = "Jaar", y = "Temperatuur (°F)")
Tian Zheng van Columbia heeft een handige [PDF van R kleuren] gemaakt
(http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf).
Natuurlijk kun je ook hex kleurcodes opgeven (gewoon als strings zoals
in het voorbeeld hierboven), maar ook RGB of RGBA waarden (via de
rgb()
functie:
rgb(red, green, blue, alpha)
).
In ggplot2
worden kleuren die aan variabelen zijn
toegekend, gewijzigd via de functies scale_color_* en scale_fill_*. Om
kleuren te gebruiken met uw gegevens, moet u vooral weten of u te maken
heeft met een categorische of continue variabele. Het kleurenpalet moet
worden gekozen afhankelijk van het type variabele, waarbij sequentiële
of divergerende kleurenpaletten worden gebruikt voor continue variabelen
en kwalitatieve kleurenpaletten voor categorische variabelen:
Kwalitatieve of categorische variabelen staan voor soorten gegevens die in groepen (categorieën) kunnen worden ingedeeld. De variabele kan verder worden gespecificeerd als nominaal, ordinaal, en binair (dichotomisch). Voorbeelden van kwalitatieve/categorische variabelen zijn: