Hoe kun je goed werken aan datavisualisatie met ggplot2 binnen R/RStudio
ggplot is een R-pakket om data te onderzoeken en vooral om mooie en duidelijke figuren te maken. Deze figuren zien er grafisch fantastisch uit en kunnen op verschillende manieren worden aangepast. Er zijn verschillende tutorials en boeken beschikbaar die je uitleggen hoe het werkt. Hier volgen we de uitleg van Zev Ross.
Bekijk de dataset eerst goed. In dit geval gaat het om een data uit Chicago over luchtvervuiling over een aantal jaren. Het jaartal zit erin, het aantal doden per dag, de temperatuur, dan twee uitkomstmaten, het tijdstip en de seizoenen. Het zijn deze data die we zichtbaar gaan maken met het pakket ggplot van R.
logical(0)
city date death temp dewpoint pm10 o3 time
3654 chic 1997-01-01 137 36.0 37.50 13.052268 5.659256 3654
3655 chic 1997-01-02 123 45.0 47.25 41.948600 5.525417 3655
3656 chic 1997-01-03 127 40.0 38.00 27.041751 6.288548 3656
3657 chic 1997-01-04 146 51.5 45.50 25.072573 7.537758 3657
3658 chic 1997-01-05 102 27.0 11.25 15.343121 20.760798 3658
3659 chic 1997-01-06 127 17.0 5.75 9.364655 14.940874 3659
season
3654 winter
3655 winter
3656 winter
3657 winter
3658 winter
3659 winter
Het standaardfiguur is de volgende waarbij je aangeeft hoe de dataset in elkaar zit, naar welke variabelen je kijkt en wat je wilt zien. Let goed op, je ziet dat ggplot met duidelijke lagen werkt waar steeds passende commando’s bij horen.
Je kunt er ook een titel aan toevoegen.
De titel kun je ook vet maken en meer ruimte geven.
De titel kun je ook meer ruimte geven via commando (lineheight).
Je kunt ook tekst aan de x en y as toevoegen o.a. door (labs() of bijvoorbeel xlab())
Je kunt ook gegevens op de y-as weghalen door labels (theme(), axis.ticks.y)
Je kunt de gegevens op de assen aanpassen, bv. op de x en roteren (axis.text.x)
De tekst op x en y-as kun je ook nog een kleurtje geven door(theme(), axis.title.x)
Je kunt de gegevens die je wilt laten zien, ook weer in bereik beperken (ylim).
Als de assen hetzelfde moeten zijn, kan ook (coord_equal())
Je kunt ook de labels aanpassen (label=function(x){}) en de gegevens over de maanden toevoegen.
De legenda kan worden aangepast nu.
Je kunt de titel van de legenda ‘uitzetten’ (legend.title)
Ook de stijl van de legenda titel kun je aanpassen (legend.title)
Je kunt ook de titelzelf veranderen (name)
Je kunt ook de achtergrondkleur van de legenda aanpassen (legend.key)
Of alleen het symbool in de legenda(guides(), guide_legend)
Je kunt ook de temperatuur ipv een punt afdrukken (show_guide)
Er zijn nog meer aanpassingen van de legenda mogelijk via (guides(), override.aes)
De achtergrond is aan te passen (panel.background)
Niet in het panel maar verder wel kleur aanpassen (plot.background)
De plot margin aanpassen(plot.margin)
Je kunt ook met thema’s werken, mooi en consistent, bijvoorbeeld hier eentje uit het blad ‘The Economist’.
Je kunt ook de omvang van de elementen aanpassen via text elements (theme_set(), base_size)
function (base_size = 11, base_family = "", base_line_size = base_size/22,
base_rect_size = base_size/22)
{
half_line <- base_size/2
theme(line = element_line(colour = "black", size = base_line_size,
linetype = 1, lineend = "butt"), rect = element_rect(fill = "white",
colour = "black", size = base_rect_size, linetype = 1),
text = element_text(family = base_family, face = "plain",
colour = "black", size = base_size, lineheight = 0.9,
hjust = 0.5, vjust = 0.5, angle = 0, margin = margin(),
debug = FALSE), axis.line = element_blank(), axis.line.x = NULL,
axis.line.y = NULL, axis.text = element_text(size = rel(0.8),
colour = "grey30"), axis.text.x = element_text(margin = margin(t = 0.8 *
half_line/2), vjust = 1), axis.text.x.top = element_text(margin = margin(b = 0.8 *
half_line/2), vjust = 0), axis.text.y = element_text(margin = margin(r = 0.8 *
half_line/2), hjust = 1), axis.text.y.right = element_text(margin = margin(l = 0.8 *
half_line/2), hjust = 0), axis.ticks = element_line(colour = "grey20"),
axis.ticks.length = unit(half_line/2, "pt"), axis.title.x = element_text(margin = margin(t = half_line/2),
vjust = 1), axis.title.x.top = element_text(margin = margin(b = half_line/2),
vjust = 0), axis.title.y = element_text(angle = 90,
margin = margin(r = half_line/2), vjust = 1), axis.title.y.right = element_text(angle = -90,
margin = margin(l = half_line/2), vjust = 0), legend.background = element_rect(colour = NA),
legend.spacing = unit(2 * half_line, "pt"), legend.spacing.x = NULL,
legend.spacing.y = NULL, legend.margin = margin(half_line,
half_line, half_line, half_line), legend.key = element_rect(fill = "grey95",
colour = "white"), legend.key.size = unit(1.2, "lines"),
legend.key.height = NULL, legend.key.width = NULL, legend.text = element_text(size = rel(0.8)),
legend.text.align = NULL, legend.title = element_text(hjust = 0),
legend.title.align = NULL, legend.position = "right",
legend.direction = NULL, legend.justification = "center",
legend.box = NULL, legend.box.margin = margin(0, 0, 0,
0, "cm"), legend.box.background = element_blank(),
legend.box.spacing = unit(2 * half_line, "pt"), panel.background = element_rect(fill = "grey92",
colour = NA), panel.border = element_blank(), panel.grid = element_line(colour = "white"),
panel.grid.minor = element_line(size = rel(0.5)), panel.spacing = unit(half_line,
"pt"), panel.spacing.x = NULL, panel.spacing.y = NULL,
panel.ontop = FALSE, strip.background = element_rect(fill = "grey85",
colour = NA), strip.text = element_text(colour = "grey10",
size = rel(0.8), margin = margin(0.8 * half_line,
0.8 * half_line, 0.8 * half_line, 0.8 * half_line)),
strip.text.x = NULL, strip.text.y = element_text(angle = -90),
strip.placement = "inside", strip.placement.x = NULL,
strip.placement.y = NULL, strip.switch.pad.grid = unit(half_line/2,
"pt"), strip.switch.pad.wrap = unit(half_line/2,
"pt"), plot.background = element_rect(colour = "white"),
plot.title = element_text(size = rel(1.2), hjust = 0,
vjust = 1, margin = margin(b = half_line)), plot.subtitle = element_text(hjust = 0,
vjust = 1, margin = margin(b = half_line)), plot.caption = element_text(size = rel(0.8),
hjust = 1, vjust = 1, margin = margin(t = half_line)),
plot.tag = element_text(size = rel(1.2), hjust = 0.5,
vjust = 0.5), plot.tag.position = "topleft", plot.margin = margin(half_line,
half_line, half_line, half_line), complete = TRUE)
}
<bytecode: 0x000000001dc91dd0>
<environment: namespace:ggplot2>
function (base_size = 12, base_family = "")
{
theme(
line = element_line(colour = "black", size = 0.5, linetype = 1, lineend = "butt"),
rect = element_rect(fill = "white", colour = "black", size = 0.5, linetype = 1),
text = element_text(family = base_family, face = "plain", colour = "black", size = base_size, hjust = 0.5, vjust = 0.5, angle = 0, lineheight = 0.9),
axis.text = element_text(size = rel(0.8), colour = "grey50"),
strip.text = element_text(size = rel(0.8)),
axis.line = element_blank(),
axis.text.x = element_text(vjust = 1),
axis.text.y = element_text(hjust = 1),
axis.ticks = element_line(colour = "grey50"),
axis.title.x = element_text(),
axis.title.y = element_text(angle = 90),
axis.ticks.length = unit(0.15, "cm"),
axis.ticks.margin = unit(0.1, "cm"),
legend.background = element_rect(colour = NA),
legend.margin = unit(0.2, "cm"),
legend.key = element_rect(fill = "grey95", colour = "white"),
legend.key.size = unit(1.2, "lines"),
legend.key.height = NULL,
legend.key.width = NULL,
legend.text = element_text(size = rel(0.8)),
legend.text.align = NULL,
legend.title = element_text(size = rel(0.8), face = "bold", hjust = 0),
legend.title.align = NULL,
legend.position = "right",
legend.direction = NULL,
legend.justification = "center",
legend.box = NULL,
panel.background = element_rect(fill = "grey90", colour = NA),
panel.border = element_blank(),
panel.grid.major = element_line(colour = "white"),
panel.grid.minor = element_line(colour = "grey95", size = 0.25),
panel.margin = unit(0.25, "lines"),
panel.margin.x = NULL,
panel.margin.y = NULL,
strip.background = element_rect(fill = "grey80", colour = NA),
strip.text.x = element_text(),
strip.text.y = element_text(angle = -90),
plot.background = element_rect(colour = "white"),
plot.title = element_text(size = rel(1.2)),
plot.margin = unit(c(1, 1, 0.5, 0.5), "lines"), complete = TRUE)
}
Bij categoriale variabelen kun je de kleur zelf aanpassen (scale_color_manual)
Je kunt voor categoriale variabelen ook een ‘’inbouw-palette’ gebruiken (gebaseerd op colorbrewer2.org) (scale_color_brewer):
Bij continue variabelen kun je ook een kleurkeus gebruiken met een schaal (scale_color_gradient(), scale_color_gradient2())
De annotatie-tekst kun je overal in het figuur kwijt top-rechts, top-links etc. (annotation_custom() and textGrob())
De figuur omgedraaid (coord_flip())
Alternatieven voor de box plot (geom_jitter() and geom_violin()) Box plots kunnen goed zijn, maar ook vervelen. Hier wat alternatieven, eerst - een box plot en dan de rest:
Eerst een lint maken (geom_ribbon())
Dan een filter eroverheen.
Hier een correlation plot (geom_tile()) Opgepast, de namen zijn gesorteerd zodat de ordening in de uiteindelijk plot goed is.
death dewpoint o3 pm10 temp
death 1 -0.47 -0.24 0.00 -0.49
dewpoint NA 1.00 0.45 0.33 0.96
o3 NA NA 1.00 0.21 0.53
pm10 NA NA NA 1.00 0.37
temp NA NA NA NA 1.00
Var1 Var2 value
1 death death 1.00
6 death dewpoint -0.47
7 dewpoint dewpoint 1.00
11 death o3 -0.24
12 dewpoint o3 0.45
13 o3 o3 1.00
Hier de standaard (stat_smooth())
Je kunt ook de formule aanpassen(stat_smooth(formula=))
Je kunt ook een liniaire lijn trekken (stat_smooth(method=“lm”))
Zev Ross. Beautiful plotting in R: a ggplopt2 cheatsheet Zev Ross
Harvard University. Introduction to R Graphics wiht ggplot2 Harvard
Dawn Koffman. Introduction to ggplot2 Office of Population Research, Princeton University. Princeton
RStudio. Data visualisation with ggplot2. Cheatsheet. RStudio
Wickham, H. (2010). ggplot2: Elegant graphics for data analysis(Use R!). Houston: Rice University.
Chang, W. (2013).RGraphics Cookbook. a practical recipes for visualizing data Sebastopol: O’Reilly Media.