Spredningsplott i R ved bruk av ggplot2 med eksempel

⚡ Smart oppsummering

Punktdiagram i R ved bruk av ggplot2 kartlegger to kontinuerlige variabler til x- og y-aksene med geom_point(). Denne gjennomgangen dekker grupperping etter farge, logaritmiske transformasjoner, tilpassede regresjonslinjer, etiketter, fasettering, overplottingsrettelser, skalaer, temaer og lagring.

  • 📍 Basissyntaks: ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() bygger plottet fra data, kartpingog geometri.
  • 🎨 Gruppefarging: aes(color = factor(gear)) i geom_point() deler punktene inn i én farge per faktornivå.
  • 📈 Trendlinjer: stat_smooth(method = “lm”) legger en tilpasset regresjonslinje over, og se = FALSE fjerner konfidensbåndet.
  • 🗂️ Fasettering: facet_wrap() tegner ett panel per gruppe på en delt skala, noe som slår å samle alle serier i ett diagram.
  • 🔁 Overplotting: Senk alfaverdien, forvri punktene, eller bytt til geom_hex() når markører hoper seg opp på hverandre.
  • 💾 Eksport: ggsave(“plot.png”, bredde = 8, høyde = 5, dpi = 300) skriver det siste plottet til arbeidskatalogen.

Punktdiagram i R ved bruk av ggplot2

Hvorfor grafer er viktige i dataanalyse

Grafer er den tredje delen av prosessen med dataanalyse. Den første delen handler om dataekstracsjon, tar den andre delen for seg rense og manipulere dataene. Endelig kan dataforskeren trenge det kommunisere resultatene hans grafisk.

Arbeidsflyten til en dataforsker er oppsummert i bildet nedenfor.

  • Den første oppgaven til en dataforsker er å definere et forskningsspørsmål. Dette forskningsspørsmålet avhenger av mål og mål for prosjektet.
  • Etter det er en av de mest fremtredende oppgavene funksjonsteknikken. Dataforskeren må samle inn, manipulere og rense dataene
  • Når dette trinnet er fullført, kan han begynne å utforske datasettet. Noen ganger er det nødvendig å avgrense og endre den opprinnelige hypotesen på grunn av en ny oppdagelse.

Spredningsplott i R

  • når forklarende analysen er oppnådd, må dataforskeren vurdere leserens kapasitet til forstå de underliggende konseptene og modellene.
  • Resultatene hans bør presenteres i et format som alle interessenter kan forstå. En av de beste metodene for å kommunisere resultatene er gjennom en graf.
  • Grafer er et utrolig verktøy for å forenkle komplekse analyser.

Resten av denne veiledningen bygger disse grafene med ggplot2-pakken.

ggplot2-pakken

Denne veiledningen fokuserer på å bygge diagrammer i R med ggplot2.

I denne veiledningen skal du bruke ggplot2-pakken. Pakken implementerer Grammar of Graphics beskrevet av Leland Wilkinson i 2005. ggplot2 er fleksibel, leveres med mange temaer og lar deg spesifisere et plott på et høyt abs-nivå.tracMerk at den ikke produserer tredimensjonal eller interaktiv grafikk; disse krever pakker som plotly eller rgl.

I ggplot2 er en graf sammensatt av følgende argumenter:

  • dato
  • estetisk kartping
  • geometrisk objekt
  • statistiske transformasjoner
  • vekter
  • koordinatsystem
  • posisjonsjusteringer
  • fasettering

Du vil lære hvordan du kontrollerer disse argumentene i opplæringen.

Den grunnleggende syntaksen til ggplot2 er:

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()`

Slik lager du et spredningsplott i R

La oss se hvordan ggplot fungerer med mtcars-datasettet. Du starter med å plotte et scatterplot av mpg-variabelen og drat-variabelen.

Grunnleggende spredningsplott

library(ggplot2)
ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point()

Code Forklaring

  • Du sender først datasettet mtcars til ggplot.
  • Inne i aes()-argumentet legger du til x-aksen og y-aksen.
  • +-tegnet betyr at du vil at R skal fortsette å lese koden. Det gjør koden mer lesbar ved å bryte den.
  • Bruk geom_point() for det geometriske objektet.

Utgang:

Grunnleggende spredningsplott

Spredningsplott med grupper

Noen ganger kan det være interessant å skille verdiene med en gruppe data (dvs. data på faktornivå).

ggplot(mtcars, aes(x = mpg, y = drat)) +
    geom_point(aes(color = factor(gear)))

Code Forklaring

  • aes() i geom_point() kontrollerer fargen på hver gruppe. Grouping variabelen må være en faktor, så gir pakkes inn i factor().
  • Til sammen har du koden aes(color = factor(gear)) som endrer fargen på prikkene.

Utgang:

Spredningsplott med grupper

Endre akseskalaen med en logaritmisk transformasjon

Å reskalere data er en stor del av analytikerjobben, fordi rådariabler sjelden ankommer i en pen klokkeform. Å ta logaritmer er én måte å komprimere ekstremverdier og gjøre plottet mindre følsomt for avvikere.

ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
    geom_point(aes(color = factor(gear)))

Code Forklaring

  • Du transformerer x- og y-variablene i log() direkte inne i aes()-kartetping.

Merk at enhver annen transformasjon kan brukes som standardisering eller normalisering.

Utgang:

Endre akse

Spredningsplott med tilpassede verdier

Du kan legge til et nytt informasjonsnivå i grafen. Du kan legge de tilpassede verdiene til en overlappende lineær regresjon.

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 Forklaring

  • my_graph: plottet lagres i objektet my_graph, slik at senere trinn kan legge til lag uten å gjenta hele kallet
  • Argumentet stat_smooth() kontrollerer utjevningsmetoden
  • metode = "lm": Lineær regresjon
  • kolonne = «#C42126»: Code for den røde fargen på linjen
  • se = FALSE: Ikke vis standardfeilen
  • størrelse = 1: tykkelsen på linjen. I ggplot2 3.4.0 og senere ble dette argumentet omdøpt til linjebredde for linjegeometrier.

Utgang:

Spredningsplott med tilpassede verdier

Merk at andre utjevningsmetoder er tilgjengelige

  • glm
  • gam
  • løss: standardverdien for færre enn 1,000 observasjoner
  • rlm: robust lineær modell, fra MASS-pakken

Før du styler diagrammet, er det verdt å vite når et spredningsplott i det hele tatt er det riktige valget.

Punktdiagram vs. linjediagram vs. Bubble-diagram i R

Alle tre plotter to kontinuerlige variabler mot hverandre, så valget kommer ned til hva leseren skal ta med seg.

Kriterier Spredningsplott Linjediagram Bubble Diagram
Viser Korrelasjon mellom to variabler Endring av én variabel over en ordnet akse Korrelasjon pluss en tredje størrelsesorden
X-akse Enhver kontinuerlig variabel Vanligvis tid eller en annen ordnet skala Enhver kontinuerlig variabel
Poengordre irrelevant Kritisk, punktene er koblet sammen irrelevant
Tredje variabel Gjennom farge eller form Gjennom separate linjer Gjennom punktstørrelse
ggplot2-kall geom_point() geom_linje() geom_point(aes(størrelse = z))

Å koble punktpunkter med en linje når x-aksen ikke har noen naturlig orden er en vanlig feil: det impliserer en sekvens som ikke eksisterer. Reserver geom_line() for ordnede akser som datoer. For fordelinger av en enkelt variabel, bruk en boksplott i stedet.

Legg til informasjon i grafen

Så langt har grafene ingen forklarende tekst. En leser skal kunne se historien i dataene fra diagrammet alene, uten å konsultere ekstra dokumentasjon, noe som betyr at diagrammet trenger gode etiketter. Du kan legge til etiketter med labs()-funksjonen.

Den grunnleggende syntaksen for labs() er:

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

Legg til en tittel

En obligatorisk informasjon å legge til er åpenbart en tittel.

my_graph +
    labs(
        title = "Plot Mile per hours and drat, in log"
         )

Code Forklaring

  • my_graph: Du bruker grafen du lagret. Den unngår å skrive om alle kodene hver gang du legger til ny informasjon i grafen.
  • Du pakker tittelen inn i labs().

Utgang:

Legg til en tittel

Legg til en tittel med et dynamisk navn

En dynamisk tittel er nyttig for å legge til mer presis informasjon i tittelen.

Du kan bruke paste()-funksjonen til å skrive ut statisk tekst og dynamisk tekst. Den grunnleggende syntaksen til paste() er:

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	

Eksempel:

A <- 2010
paste("The first year is", A)

Utgang:

## [1] "The first year is 2010"
B <- 2018
paste("The first year is", A, "and the last year is", B)

Utgang:

## [1] "The first year is 2010 and the last year is 2018"

Du kan legge til et dynamisk navn til grafen vår, nemlig gjennomsnittet av 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 Forklaring

  • Du lager gjennomsnittet av mpg med mean(mtcars$mpg) lagret i mean_mpg variabel
  • Du bruker paste() med mean_mpg for å lage en dynamisk tittel som returnerer gjennomsnittsverdien til mpg

Utgang:

Legg til en tittel med et dynamisk navn

Legg til en undertekst

To ytterligere detaljer gjør grafen mer eksplisitt. Du snakker om undertittelen og bildeteksten. Undertittelen går rett under tittelen. Bildeteksten kan informere om hvem som utførte beregningen og kilden til dataene.

my_graph +
    labs(
        title =
        "Relation between Mile per hours and drat",
        subtitle =
        "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code Forklaring

  • Inne i labs() la du til:
    • title = "Relation between Mile per hours and drat": Legg til tittel
    • undertittel = "Forholdsfordeling etter utstyrsklasse": Legg til undertittel
    • caption = "Forfatterens egen beregning: Legg til bildetekst
    • Du skiller hver ny informasjon med et komma, ,
  • Merk at du bryter kodelinjene. Det er ikke obligatorisk, og det hjelper bare å lese koden lettere

Utgang:

Legg til en undertekst

Gi nytt navn til x-aksen og y-aksen

Kolonnenavn er sjelden klare for presentasjon. De er ofte forkortet eller bruker understrek mellom ord, som i GDP_CAP. Gi dem nytt navn i plottet og legg til enheter der de er viktige.

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 Forklaring

  • Inne i labs() la du til:
    • x = "Drat-definisjon": Endre navnet på x-aksen
    • y = "Mile per timer": Endre navnet på y-aksen

Utgang:

Gi nytt navn til x-aksen og y-aksen

Kontroller vekten

Du kan kontrollere skalaen til aksen.

Funksjonen seq() er praktisk når du trenger å lage en tallsekvens. Den grunnleggende syntaksen er:

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`	

For eksempel returnerer et område fra 0 til 12 med et trinn på 4 fire tall: 0, 4, 8 og 12.

seq(0, 12,4)

Utgang:

## [1]  0  4  8 12

Du kan kontrollere skalaen til x-aksen og y-aksen som nedenfor

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 Forklaring

  • Funksjonen scale_y_continuous() kontrollerer y-aksen
  • Funksjonen scale_x_continuous() kontrollerer x-aksen.
  • Parameterbrudd styrer splittelsen av aksen. Du kan manuelt legge til nummersekvensen eller bruke seq()-funksjonen:
    • seq(1, 3.6, by = 0.2): Opprett sekvensen fra 1 til 3.6 i trinn på 0.2, det vil si 14 bruddpunkter
    • seq(1, 1.6, by = 0.1): Lag sju tall fra 1 til 1.6 i trinn på 0.1

Utgang:

Kontroller vekten

tema

Til slutt lar ggplot2 deg endre stilen på hele plottet med én enkelt temafunksjon. Åtte komplette temaer følger med pakken:

  • theme_bw()
  • theme_light()
  • tema_klassisk()
  • theme_linedraw()
  • theme_dark()
  • theme_minimal()
  • tema_grå()
  • theme_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"
    )

Utgang:

tema

Lagre plott

Etter alle disse trinnene er det på tide å lagre og dele grafen din. Kall ggsave(“navn_på_filen.png”) rett etter plotting, og bildet skrives til disk.

Grafen lagres i arbeidskatalogen. For å sjekke arbeidskatalogen kan du kjøre denne koden:

directory <- getwd()
directory

Tegn den ferdige grafen, lagre den og sjekk hvor den havnet:

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

Utgang:

Lagre plott

ggsave("my_fantastic_plot.png")

Utgang:

## Saving 5 x 4 in image

Merknader: Kun for pedagogiske formål opprettet vi en funksjon kalt open_folder() for å åpne katalogmappen for deg. Du trenger bare å kjøre koden nedenfor og se hvor bildet er lagret. Du bør se en fil som heter my_fantastic_plot.png.

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

Slik lager du fasetterte punktdiagrammer i R med facet_wrap()

Fasettering er en av de åtte ggplot2-komponentene som er nevnt tidligere, og det er det reneste svaret på et overfylt diagram. I stedet for å klemme hver gruppe inn i ett panel, tegner ggplot2 et lite multiplum for hvert nivå av en variabel, alt på samme skalaer, slik at panelene forblir sammenlignbare.

# One panel per gear count
ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point() +
    facet_wrap(~ gear) +
    theme_classic()

Tre argumenter gjør mesteparten av jobben.

  • ncol or innskrenketving panelene inn i et gitt oppsett, for eksempel facet_wrap(~ gear, ncol = 2).
  • vekter«fast» som standard, slik at hvert panel deler ett akseområde. Bruk «free_y» eller «free» når gruppene varierer sterkt i størrelse, men vær oppmerksom på at frie skalaer gjør visuell sammenligning mellom paneler misvisende.
  • labeller: erstatter råfaktornivået i hver stripe, for eksempel labeller = label_both for å skrive ut «gear: 4» i stedet for «4».

To grupperping variabler. Bruk facet_grid() til å bygge en matrise av paneler, med den første variabelen på tvers av rader og den andre på tvers av kolonner:

ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point(aes(color = factor(cyl))) +
    facet_grid(am ~ gear) +
    theme_classic()

Fasetter eller farger? Farge fungerer bra opptil omtrent fire grupper på et diagram med begrenset overlapping. Utover det, eller når gruppene overlapper mye, er fasettering lettere å lese fordi hvert panel bare har sine egne punkter. Du kan kombinere begge deler: fasett med én variabel og farge med en annen, som i facet_grid()-eksemplet ovenfor.

Slik håndterer du overplotting i R-spredningsdiagrammer

Med noen få dusin observasjoner er hvert punkt synlig. Med tusenvis stables markørene oppå hverandre, og det tetteste området leses ganske enkelt som en hel flekk. Det vil si overplotting, og ggplot2 tilbyr fire standardløsninger.

1. Reduser opasiteten. Den billigste løsningen. Overlappingping punktene mørkner naturlig, slik at tettheten blir synlig:

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_point(alpha = 0.05) +
    theme_classic()

2. Diskrete verdier for jitter. Når en variabel bare tar en håndfull verdier, lander punktene på de samme koordinatene. En liten tilfeldig forskyvning skiller dem:

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
    geom_jitter(width = 0.15, height = 0) +
    theme_classic()

Sett høyde = 0 slik at y-verdiene, som inneholder den reelle informasjonen, aldri endres.

3. Kast flyet. For store datasett, tell observasjoner per celle og tilordne antallet til farge. Sekskantede kasser unngår de visuelle artefaktene som firkantede kasser produserer:

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_hex(bins = 40) +
    theme_classic()

4. Tegn tetthetskonturer. Konturlinjer skisserer områdene der observasjonene konsentreres, og de legger seg pent over falmede punkter:

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_point(alpha = 0.05) +
    geom_density_2d(color = "#C42126") +
    theme_classic()

Som en tommelfingerregel håndterer alfa noen få tusen punkter, heksagonal binning håndterer titusenvis, og sampling av data med dplyr::slice_sample() er det pragmatiske alternativet utover det.

Spredningsplott i R: Code Referanse

Tabellen nedenfor viser ggplot2-kallet for hvert alternativ som er dekket ovenfor:

Målet Code
Grunnleggende spredningsplott
ggplot(df, aes(x = x1, y = y)) + geom_point()
Punktdiagram med fargegruppe
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2)))
Legg til tilpassede verdier
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm")
Legg til tittel
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99"))
Legg til undertekst
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99"))
Gi nytt navn til x
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1")
Gi nytt navn til y
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1")
Kontroller vekten
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))
Lag logger
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point()
tema
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic()
Fasett av en gruppe
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2)
Håndter overplotting
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3)
Spar
ggsave("my_fantastic_plot.png")

Spørsmål og svar

geom_point() tegner hver observasjon ved sine eksakte koordinater. geom_jitter() legger til en liten tilfeldig forskyvning slik at punkter som deler samme verdi blir skillebare, noe som er viktig når én akse har diskrete verdier.

Inne i aes() tilordner farge en variabel, så ggplot2 tilordner én nyanse per nivå og bygger en forklaring. Utenfor aes() er farge en fast konstant som brukes på hvert punkt, og ingen forklaring vises.

Legg til stat_smooth(method = “lm”) eller geom_smooth(method = “lm”) etter geom_point(). Sett se = FALSE for å skjule konfidensbåndet, og bruk method = “loess” for en ikke-lineær utjevning.

Punktdiagrammer avslører funksjonskorrelasjon og avvikere før trening, og de er standardmåten for å vise predikerte mot faktiske verdier eller for å visualisere klynger etter dimensjonalitetsreduksjon med PCA eller t-SNE.

Ja. AI-assistenter kan lage utkast til lag, foreslå rettelser for overplotting og forklare feil som manglende aes()-omslag. Kjør den genererte koden på dine egne data, fordi kolonnenavn og faktortyper er lette å ta feil av.

Oppsummer dette innlegget med: