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.

  • 📍 Basissyntaxis: ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() bouwt de plot op basis van data en map.pingen geometrie.
  • ???? Groepskleuring: aes(color = factor(gear)) inside geom_point() verdeelt de punten in één kleur per factorniveau.
  • 📈 Trendlijnen: stat_smooth(method = “lm”) voegt een aangepaste regressielijn toe, en se = FALSE verwijdert de betrouwbaarheidsband.
  • 🗂️ Facetten: facet_wrap() tekent één paneel per groep op een gedeelde schaal, wat beter is dan alle series in één grafiek te proppen.
  • 🔁 Overplotten: Verlaag de alfawaarde, laat de punten verschuiven of schakel over naar geom_hex() wanneer de markers zich ophopen.
  • 💾 Exporteren: ggsave(“plot.png”, width = 8, height = 5, dpi = 300) schrijft de laatst getekende grafiek naar de werkmap.

Spreidingsdiagram in R met behulp van ggplot2

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.

Spreidingsplot in R

  • 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:

Basisspreidingsdiagram

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:

Spreidingsplot met groepen

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:

As wijzigen

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:

Spreidingsdiagram met aangepaste waarden

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

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 titel toe met een dynamische naam

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:

Voeg een ondertitel toe

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:

Hernoem de x-as en y-as

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:

Beheers de weegschaal

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:

Thema

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:

Percelen opslaan

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

Veelgestelde vragen

geom_point() tekent elke observatie op de exacte coördinaten. geom_jitter() voegt een kleine willekeurige verschuiving toe, zodat punten met dezelfde waarde onderscheidbaar worden. Dit is belangrijk wanneer één as discrete waarden bevat.

Binnen de `aes()`-functie wordt de kleur toegewezen aan een variabele, waardoor ggplot2 één tint per niveau toewijst en een legenda genereert. Buiten de `aes()`-functie is de kleur een vaste constante die op elk punt wordt toegepast, en verschijnt er geen legenda.

Voeg stat_smooth(method = “lm”) of geom_smooth(method = “lm”) toe na geom_point(). Stel se = FALSE in om de betrouwbaarheidsband te verbergen en gebruik method = “loess” voor een niet-lineaire smoother.

Spreidingsdiagrammen tonen correlaties tussen kenmerken en uitschieters vóór de training, en ze zijn de standaardmethode om voorspelde waarden af ​​te zetten tegen werkelijke waarden of om clusters te visualiseren na dimensionale reductie met PCA of t-SNE.

Ja. AI-assistenten kunnen lagen ontwerpen, suggesties doen voor het corrigeren van overlappingen en fouten uitleggen, zoals een ontbrekende aes()-wrapper. Voer de gegenereerde code uit op uw eigen gegevens, want kolomnamen en factortypen kunnen gemakkelijk verkeerd worden ingevoerd.

Vat dit bericht samen met: