Spreidingsdiagram in R met ggplot2, inclusief voorbeeld.
⚡ Slimme samenvatting
Een spreidingsdiagram in R met ggplot2 zet twee continue variabelen om naar de x- en y-as met behulp van geom_point(). Deze handleiding behandelt groepenping op basis van kleur, logaritmische transformaties, aangepaste regressielijnen, labels, facetten, overplotting-correcties, schalen, thema's en opslaan.
Waarom grafieken belangrijk zijn bij data-analyse
Grafieken vormen het derde deel van het proces van data-analyse. Het eerste deel gaat over gegevens extractie, waar het tweede deel over gaat het opschonen en manipuleren van de gegevens. Eindelijk moet de datawetenschapper dat misschien ook doen zijn resultaten grafisch communiceren.
De workflow van een data scientist wordt samengevat in de onderstaande afbeelding.
- De eerste taak van een datawetenschapper is het definiëren van een onderzoeksvraag. Deze onderzoeksvraag is afhankelijk van de doelstellingen van het project.
- Daarna is een van de meest prominente taken de feature-engineering. De datawetenschapper moet de gegevens verzamelen, manipuleren en opschonen
- Wanneer deze stap is voltooid, kan hij beginnen met het verkennen van de dataset. Soms is het nodig om de oorspronkelijke hypothese te verfijnen en te veranderen als gevolg van een nieuwe ontdekking.
- Wanneer de verklarend analyse is bereikt, moet de datawetenschapper rekening houden met het vermogen van de lezer om dat te doen de onderliggende concepten en modellen begrijpen.
- Zijn resultaten moeten worden gepresenteerd in een formaat dat alle belanghebbenden kunnen begrijpen. Een van de beste methoden om communiceren de resultaten zijn via a diagram.
- Grafieken zijn een geweldig hulpmiddel om complexe analyses te vereenvoudigen.
De rest van deze handleiding bouwt die grafieken met behulp van het ggplot2-pakket.
Het ggplot2-pakket
Deze handleiding richt zich op het maken van grafieken in R met ggplot2.
In deze tutorial ga je het ggplot2-pakket gebruiken. Dit pakket implementeert de Grammar of Graphics, zoals beschreven door Leland Wilkinson in 2005. ggplot2 is flexibel, wordt geleverd met veel thema's en stelt je in staat een plot op een hoog abstractieniveau te specificeren.tracHet programma produceert geen driedimensionale of interactieve grafieken; daarvoor zijn pakketten zoals Plotly of RGL nodig.
In ggplot2 bestaat een grafiek uit de volgende argumenten:
- gegevens
- esthetische kaartping
- geometrisch voorwerp
- statistische transformaties
- balans
- coördinatie systeem
- positie aanpassingen
- faceting
In de tutorial leert u hoe u deze argumenten kunt beheersen.
De basissyntaxis van ggplot2 is:
ggplot(data, mapping=aes()) + geometric object arguments: data: Dataset used to plot the graph mapping: Control the x and y-axis geometric object: The type of plot you want to show. The most common object are: - Point: `geom_point()` - Bar: `geom_bar()` - Line: `geom_line()` - Histogram: `geom_histogram()`
Hoe maak je een spreidingsdiagram in R?
Laten we eens kijken hoe ggplot werkt met de mtcars-dataset. U begint met het plotten van een spreidingsdiagram van de mpg-variabele en de drat-variabele.
Basis spreidingsdiagram
library(ggplot2) ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point()
Code Uitleg
- U geeft eerst de dataset mtcars door aan ggplot.
- Binnen het argument aes() voegt u de x-as en de y-as toe.
- Het + teken betekent dat u wilt dat R de code blijft lezen. Het maakt de code leesbaarder door deze te breken.
- Gebruik geom_point() voor het geometrische object.
Output:
Spreidingsplot met groepen
Soms kan het interessant zijn om de waarden te onderscheiden op basis van een groep gegevens (dat wil zeggen gegevens op factorniveau).
ggplot(mtcars, aes(x = mpg, y = drat)) + geom_point(aes(color = factor(gear)))
Code Uitleg
- De functie aes() binnen geom_point() bepaalt de kleur van elke groep. De groepping De variabele moet een factor zijn, dus de versnelling wordt omwikkeld met factor().
- Alles bij elkaar heb je de code aes(color = factor(gear)) die de kleur van de stippen verandert.
Output:
Wijzig de schaal van de assen met een logaritmische transformatie.
Het herschalen van data is een belangrijk onderdeel van het werk van een analist, omdat ruwe variabelen zelden een keurige klokvormige curve hebben. Het nemen van de logaritme is een manier om extreme waarden samen te drukken en de grafiek minder gevoelig te maken voor uitschieters.
ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear)))
Code Uitleg
- Je transformeert de variabelen x en y in log() rechtstreeks binnen de aes()-functie.ping.
Merk op dat elke andere transformatie kan worden toegepast, zoals standaardisatie of normalisatie.
Output:
Spreidingsdiagram met aangepaste waarden
Je kunt nog een extra informatielaag aan de grafiek toevoegen. Je kunt de aangepaste waarden van een lineaire regressie.
my_graph <- ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear))) + stat_smooth(method = "lm", col = "#C42126", se = FALSE, size = 1) my_graph
Code Uitleg
- my_graph: de grafiek wordt opgeslagen in het object my_graph, zodat latere stappen lagen kunnen toevoegen zonder de hele aanroep te herhalen.
- Het argument stat_smooth() bestuurt de afvlakkingsmethode
- methode = “lm”: lineaire regressie
- kolom = “#C42126”: Code voor de rode kleur van de lijn
- se = FALSE: Geef de standaardfout niet weer
- size = 1: de dikte van de lijn. In ggplot2 3.4.0 en later is dit argument voor lijngeometrieën hernoemd naar linewidth.
Output:
Houd er rekening mee dat er andere afvlakkingsmethoden beschikbaar zijn
- glm
- gam
- loess: de standaardwaarde voor minder dan 1,000 waarnemingen
- rlm: robuust lineair model, uit het MASS-pakket
Voordat je de grafiek vormgeeft, is het handig om te weten wanneer een spreidingsdiagram überhaupt de juiste keuze is.
Spreidingsdiagram versus lijndiagram versus Bubble Grafiek in R
Alle drie grafieken zetten twee continue variabelen tegen elkaar uit, dus de keuze komt neer op wat de lezer eruit moet halen.
| criteria | Scatterplot | Lijngrafiek | Bubble-kaart |
|---|---|---|---|
| Shows | Correlatie tussen twee variabelen | Verandering van één variabele over een geordende as | Correlatie plus een derde orde |
| X-as | Elke continue variabele | Meestal tijd of een andere geordende schaal. | Elke continue variabele |
| Puntvolgorde | Irrelevant | Cruciaal, de punten zijn met elkaar verbonden. | Irrelevant |
| Derde variabele | Door middel van kleur of vorm | Via aparte lijnen | Door middel van puntgrootte |
| ggplot2-aanroep | geom_point() | geom_line() | geom_point(aes(size = z)) |
Het is een veelgemaakte fout om scatterpunten met een lijn te verbinden wanneer de x-as geen natuurlijke volgorde heeft: het suggereert een volgorde die niet bestaat. Gebruik geom_line() alleen voor geordende assen zoals datums. Voor verdelingen van één enkele variabele kunt u een boxplot gebruiken.
Voeg informatie toe aan de grafiek
Tot nu toe bevatten de grafieken geen toelichtende tekst. Een lezer moet het verhaal in de data kunnen afleiden uit de grafiek zelf, zonder extra documentatie te hoeven raadplegen. Dit betekent dat de grafiek duidelijke labels nodig heeft. Je kunt labels toevoegen met de functie labs().
De basissyntaxis voor labs() is:
labs(title = "Hello Guru99") arguments: - title: Main title displayed above the plot - subtitle: Secondary line below the title - caption: Note below the plot, usually the data source - x: Rename the x-axis - y: Rename the y-axis - color / fill: Rename the legend Example: labs(title = "Hello Guru99", subtitle = "My first plot")
Voeg een titel toe
Een verplichte informatie om toe te voegen is uiteraard een titel.
my_graph +
labs(
title = "Plot Mile per hours and drat, in log"
)
Code Uitleg
- my_graph: Je gebruikt de grafiek die je hebt opgeslagen. Het voorkomt dat alle codes opnieuw worden geschreven telkens wanneer u nieuwe informatie aan de grafiek toevoegt.
- Je plaatst de titel binnen labs().
Output:
Voeg een titel toe met een dynamische naam
Een dynamische titel is handig om preciezere informatie aan de titel toe te voegen.
U kunt de functie paste() gebruiken om statische tekst en dynamische tekst af te drukken. De basissyntaxis van paste() is:
paste("This is a text", A) arguments - " ": Text inside the quotation marks are the static text - A: Display the variable stored in A - Note you can add as much static text and variable as you want. You need to separate them with a comma
Voorbeeld:
A <- 2010
paste("The first year is", A)
Output:
## [1] "The first year is 2010"
B <- 2018
paste("The first year is", A, "and the last year is", B)
Output:
## [1] "The first year is 2010 and the last year is 2018"
U kunt een dynamische naam aan onze grafiek toevoegen, namelijk het gemiddelde van mpg.
mean_mpg <- mean(mtcars$mpg) my_graph + labs( title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg) )
Code Uitleg
- Je maakt het gemiddelde van mpg met mean(mtcars$mpg) opgeslagen in de mean_mpg variabele
- Je gebruikt paste() met mean_mpg om een dynamische titel te maken die de gemiddelde waarde van mpg retourneert
Output:
Voeg een ondertitel toe
Twee extra details maken de grafiek duidelijker. Je hebt het over de ondertitel en het bijschrift. De ondertitel komt direct onder de titel. Het bijschrift kan informatie geven over wie de berekening heeft uitgevoerd en de bron van de gegevens.
my_graph +
labs(
title =
"Relation between Mile per hours and drat",
subtitle =
"Relationship break down by gear class",
caption = "Authors own computation"
)
Code Uitleg
- Binnen labs() heb je het volgende toegevoegd:
- title = “Relatie tussen mijl per uur en drat”: Titel toevoegen
- ondertitel = “Relatie opgesplitst per uitrustingsklasse”: ondertitel toevoegen
- caption = “Eigen berekening van de auteur: bijschrift toevoegen
- Je scheidt elke nieuwe informatie met een komma, ,
- Merk op dat u de coderegels afbreekt. Het is niet verplicht en het helpt alleen maar om de code gemakkelijker te lezen
Output:
Hernoem de x-as en y-as
Kolomnamen zijn zelden geschikt voor presentatie. Ze zijn vaak afgekort of bevatten underscores tussen woorden, zoals in GDP_CAP. Hernoem ze in de grafiek en voeg eenheden toe waar nodig.
my_graph +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Code Uitleg
- Binnen labs() heb je het volgende toegevoegd:
- x = “Dratdefinitie”: Wijzig de naam van de x-as
- y = “Mijl per uur”: Wijzig de naam van de y-as
Output:
Beheers de weegschaal
U kunt de schaal van de as bepalen.
De functie seq() is handig als u een reeks getallen wilt maken. De basissyntaxis is:
seq(begin, last, by = x)
arguments:
- begin: First number of the sequence
- last: Last number of the sequence
- by= x: The step. For instance, if x is 2, the code adds 2 to `begin-1` until it reaches `last`
Een reeks van 0 tot 12 met een stapgrootte van 4 geeft bijvoorbeeld vier getallen terug: 0, 4, 8 en 12.
seq(0, 12,4)
Output:
## [1] 0 4 8 12
U kunt de schaal van de x-as en y-as regelen, zoals hieronder
my_graph +
scale_x_continuous(breaks = seq(1, 3.6, by = 0.2)) +
scale_y_continuous(breaks = seq(1, 1.6, by = 0.1)) +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Code Uitleg
- De functie scale_y_continuous() bestuurt de y-as
- De functie scale_x_continuous() bestuurt de x-as.
- De parametereinden regelen de splitsing van de as. U kunt de nummerreeks handmatig toevoegen of de functie seq() gebruiken:
- seq(1, 3.6, by = 0.2): Maak de reeks van 1 tot 3.6 in stappen van 0.2, dat wil zeggen 14 breekpunten.
- seq(1, 1.6, by = 0.1): Maak zeven getallen van 1 tot 1.6 met stappen van 0.1.
Output:
Thema
Tot slot biedt ggplot2 de mogelijkheid om de hele grafiek opnieuw vorm te geven met één enkele themafunctie. Het pakket bevat acht complete thema's:
- thema_bw()
- thema_licht()
- theme_classic()
- thema_linedraw()
- thema_donker()
- thema_minimaal()
- thema_grijs()
- thema_void()
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Output:
Percelen opslaan
Na al deze stappen is het tijd om je grafiek op te slaan en te delen. Roep direct na het plotten de functie ggsave(“naam_van_het_bestand.png”) aan en de afbeelding wordt naar de schijf geschreven.
De grafiek wordt opgeslagen in de werkmap. Om de werkmap te controleren, kunt u deze code uitvoeren:
directory <- getwd() directory
Teken de voltooide grafiek, sla deze op en controleer waar deze is uitgekomen:
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Output:
ggsave("my_fantastic_plot.png")
Output:
## Saving 5 x 4 in image
Note: Alleen voor pedagogische doeleinden hebben we een functie gemaakt met de naam open_folder() om de directorymap voor u te openen. U hoeft alleen maar de onderstaande code uit te voeren en te zien waar de afbeelding is opgeslagen. Je zou een bestandsnaam my_fantastic_plot.png moeten zien.
# Run this code to create the function open_folder <- function(dir) { if (.Platform['OS.type'] == "windows") { shell.exec(dir) } else { system(paste(Sys.getenv("R_BROWSER"), dir)) } } # Call the function to open the folder open_folder(directory)
Hoe maak je gefacetteerde scatterplots in R met facet_wrap()?
Facettering is een van de acht eerder genoemde ggplot2-componenten en is de meest overzichtelijke oplossing voor een overvolle grafiek. In plaats van elke groep in één paneel te proppen, tekent ggplot2 een kleine, veelvoudige weergave voor elk niveau van een variabele, allemaal op dezelfde schaal zodat de panelen vergelijkbaar blijven.
# One panel per gear count ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() + facet_wrap(~ gear) + theme_classic()
Drie argumenten volstaan voor het grootste deel van het werk.
- NcoI or nu: dwing de panelen in een bepaalde lay-out, bijvoorbeeld facet_wrap(~ gear, ncol = 2).
- balansStandaard ingesteld op "fixed", waardoor elk paneel hetzelfde asbereik deelt. Gebruik "free_y" of "free" wanneer de groepen sterk van elkaar verschillen, maar houd er rekening mee dat vrije schalen een visuele vergelijking tussen panelen misleidend maken.
- labeller: vervangt het ruwe factorniveau in elke strook, bijvoorbeeld labeller = label_both om "gear: 4" af te drukken in plaats van "4".
Twee groepenping variabelen. Gebruik facet_grid() om een matrix van panelen te maken, waarbij de eerste variabele over de rijen en de tweede over de kolommen loopt:
ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point(aes(color = factor(cyl))) + facet_grid(am ~ gear) + theme_classic()
Facetten of kleuren? Kleuren werken goed tot ongeveer vier groepen op een grafiek met beperkte overlap. Daarboven, of wanneer de groepen elkaar sterk overlappen, is facetten gemakkelijker te lezen omdat elk paneel alleen zijn eigen punten bevat. Je kunt beide combineren: facetten op basis van de ene variabele en kleuren op basis van de andere, zoals in het bovenstaande voorbeeld met facet_grid().
Hoe om te gaan met overlappende plots in R-spreidingsdiagrammen
Bij een paar dozijn waarnemingen is elk punt zichtbaar. Bij duizenden stapelen de markeringen zich op elkaar en lijkt het dichtstbevolkte gebied gewoon een massieve vlek. Dat is overplottenEn ggplot2 biedt vier standaardoplossingen.
1. Verminder de dekking. De goedkoopste oplossing. Overlapping De punten worden vanzelf donkerder, waardoor de dichtheid zichtbaar wordt:
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + theme_classic()
2. Discrete jitterwaarden. Wanneer een variabele slechts een handvol waarden aanneemt, komen punten op dezelfde coördinaten terecht. Een kleine, willekeurige verschuiving scheidt ze van elkaar:
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) + geom_jitter(width = 0.15, height = 0) + theme_classic()
Stel de hoogte in op 0, zodat de y-waarden, die de werkelijke informatie bevatten, nooit worden gewijzigd.
3. Gooi het vliegtuig weg. Bij grote datasets tel je de waarnemingen per cel en koppel je dit aantal aan een kleur. Hexagonale vakjes voorkomen de visuele artefacten die vierkante vakjes produceren:
ggplot(diamonds, aes(x = carat, y = price)) + geom_hex(bins = 40) + theme_classic()
4. Teken dichtheidscontouren. Contourlijnen geven de gebieden aan waar de waarnemingen geconcentreerd zijn, en ze liggen netjes over de vervaagde punten heen:
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + geom_density_2d(color = "#C42126") + theme_classic()
Als vuistregel geldt dat alpha enkele duizenden punten aankan, hexagonale binning tienduizenden, en het bemonsteren van de data met dplyr::slice_sample() de pragmatische optie is daarboven.
Spreidingsdiagram in R: Code Referentie
De onderstaande tabel toont de ggplot2-aanroep voor elke hierboven besproken optie:
| Objectief | Code |
|---|---|
| Basis spreidingsdiagram |
ggplot(df, aes(x = x1, y = y)) + geom_point() |
| Spreidingsdiagram met kleurgroep |
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2))) |
| Voeg gepaste waarden toe |
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm") |
| Voeg titel toe |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99")) |
| Ondertitel toevoegen |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99")) |
| Hernoem x |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1") |
| Hernoem y |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1") |
| Beheers de weegschaal |
ggplot(df, aes(x = x1, y = y)) + geom_point() + scale_y_continuous(breaks = seq(10, 35, by = 10)) + scale_x_continuous(breaks = seq(2, 5, by = 1)) |
| Maak logboeken |
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point() |
| Thema |
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic() |
| Facet door een groep |
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2) |
| Overlappende plots aanpakken |
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3) |
| Opslaan |
ggsave("my_fantastic_plot.png")
|













