Visualisatie

Hoe kun je goed werken aan datavisualisatie met ggplot2 binnen R/RStudio

Zev Ross, bewerkt door Harrie Jonkman https://Harriejonkman.nl
2-11-2017

Inleiding

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.

Snelle eerste blik

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 default-figuur in ggplot2

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.

Werken met de titel

Je kunt er ook een titel aan toevoegen.

Vet en meer ruimte

De titel kun je ook vet maken en meer ruimte geven.

Bij een lange titel

De titel kun je ook meer ruimte geven via commando (lineheight).

Op de assen werken

Je kunt ook tekst aan de x en y as toevoegen o.a. door (labs() of bijvoorbeel xlab())

Verwijderen van gegevens

Je kunt ook gegevens op de y-as weghalen door labels (theme(), axis.ticks.y)

Gegevens verder aanpassen

Je kunt de gegevens op de assen aanpassen, bv. op de x en roteren (axis.text.x)

Een kleurtje geven

De tekst op x en y-as kun je ook nog een kleurtje geven door(theme(), axis.title.x)

Beperken

Je kunt de gegevens die je wilt laten zien, ook weer in bereik beperken (ylim).

Gestandardiseerd

Als de assen hetzelfde moeten zijn, kan ook (coord_equal())

Labels veranderen

Je kunt ook de labels aanpassen (label=function(x){}) en de gegevens over de maanden toevoegen.

Legenda

De legenda kan worden aangepast nu.

Titel legenda

Je kunt de titel van de legenda ‘uitzetten’ (legend.title)

Aanpassen stijl van de titel

Ook de stijl van de legenda titel kun je aanpassen (legend.title)

Titel naam veranderen

Je kunt ook de titelzelf veranderen (name)

Achtergrondkleur aanpassen

Je kunt ook de achtergrondkleur van de legenda aanpassen (legend.key)

Of het symbool

Of alleen het symbool in de legenda(guides(), guide_legend)

De temperatuur ipv punt

Je kunt ook de temperatuur ipv een punt afdrukken (show_guide)

Andere mogelijke aanpassingen

Er zijn nog meer aanpassingen van de legenda mogelijk via (guides(), override.aes)

Aanpassen van de achtergrondkleur

De achtergrond is aan te passen (panel.background)

Ook de grid lijnen zijn aan te passen (panel.grid.major)

Berperkte kleuraanpassingen

Niet in het panel maar verder wel kleur aanpassen (plot.background)

Werken met margins

De plot margin aanpassen(plot.margin)

the default

Werken met thema’s

Je kunt ook met thema’s werken, mooi en consistent, bijvoorbeeld hier eentje uit het blad ‘The Economist’.

Use a new theme (theme_XX())

Elementen

Je kunt ook de omvang van de elementen aanpassen via text elements (theme_set(), base_size)

Je kunt ook een thema-stijl zelf ontwikkelen


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)
}

Werken met kleur

Bij categoriale variabelen kun je de kleur zelf aanpassen (scale_color_manual)

Palet

Je kunt voor categoriale variabelen ook een ‘’inbouw-palette’ gebruiken (gebaseerd op colorbrewer2.org) (scale_color_brewer):

Kleur keus bij continue variabelen

Bij continue variabelen kun je ook een kleurkeus gebruiken met een schaal (scale_color_gradient(), scale_color_gradient2())

Eenzelfde resultaat

Werken met annotatie

De annotatie-tekst kun je overal in het figuur kwijt top-rechts, top-links etc. (annotation_custom() and textGrob())

Werken met coordinaten

De figuur omgedraaid (coord_flip())

Werken met verschillende typen plots

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:

Een lint creeren

Eerst een lint maken (geom_ribbon())

Een filter

Dan een filter eroverheen.

Even wat anders

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

Werken met vegen (‘smooths’)

Hier de standaard (stat_smooth())

Formule aanpassen

Je kunt ook de formule aanpassen(stat_smooth(formula=))

Liniaire lijn

Je kunt ook een liniaire lijn trekken (stat_smooth(method=“lm”))

Referenties

  1. Zev Ross. Beautiful plotting in R: a ggplopt2 cheatsheet Zev Ross

  2. Harvard University. Introduction to R Graphics wiht ggplot2 Harvard

  3. Dawn Koffman. Introduction to ggplot2 Office of Population Research, Princeton University. Princeton

  4. RStudio. Data visualisation with ggplot2. Cheatsheet. RStudio

  5. Wickham, H. (2010). ggplot2: Elegant graphics for data analysis(Use R!). Houston: Rice University.

  6. Chang, W. (2013).RGraphics Cookbook. a practical recipes for visualizing data Sebastopol: O’Reilly Media.