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













