Scatter plot în R folosind ggplot2 cu exemplu

⚡ Rezumat inteligent

Diagrama de dispersie în R folosind ggplot2 mapează două variabile continue pe axele x și y cu geom_point(). Această prezentare prezintă grupulping prin culoare, transformări logaritmice, linii de regresie ajustate, etichete, fațetare, corecții de suprapunere, scale, teme și salvare.

  • 📍 Sintaxă de bază: ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() construiește graficul din date, hartăping, și geometrie.
  • 🎨 Colorare în grup: `aes(color = factor(gear))` din cadrul funcției `geom_point()` împarte punctele într-o singură culoare per nivel de factor.
  • 📈 Linii de tendință: stat_smooth(method = „lm”) suprapune o linie de regresie ajustată, iar se = FALSE elimină banda de încredere.
  • 🗂️ Fațetare: facet_wrap() desenează câte un panou per grup pe o scară partajată, ceea ce evită aglomerarea fiecărei serii într-un singur grafic.
  • 🔁 Overplotting: Reduceți valoarea alfa, modificați trepidația punctelor sau treceți la geom_hex() când markerele se acumulează unele peste altele.
  • 💾 export: ggsave(„plot.png”, width = 8, height = 5, dpi = 300) scrie ultimul grafic în directorul de lucru.

Scatter plot în R folosind ggplot2

De ce contează graficele în analiza datelor

Graficele reprezintă a treia parte a procesului de analiză a datelor. Prima parte este despre date extracTION, partea a doua tratează curățarea și manipularea datelor. În cele din urmă, cercetătorul de date poate avea nevoie comunica grafic rezultatele sale.

Fluxul de lucru al unui specialist în știința datelor este rezumat în imaginea de mai jos.

  • Prima sarcină a unui cercetător de date este să definească o întrebare de cercetare. Această întrebare de cercetare depinde de obiectivele și scopurile proiectului.
  • După aceea, una dintre cele mai importante sarcini este ingineria caracteristicilor. Specialistul de date trebuie să colecteze, să manipuleze și să curețe datele
  • Când acest pas este finalizat, el poate începe să exploreze setul de date. Uneori, este necesar să rafinați și să schimbați ipoteza inițială datorită unei noi descoperiri.

Graficul de dispersie în R

  • Cand explicativ analiza este realizată, cercetătorul de date trebuie să ia în considerare capacitatea cititorului de a înțelege conceptele și modelele care stau la baza.
  • Rezultatele sale ar trebui să fie prezentate într-un format pe care toți părțile interesate să îl poată înțelege. Una dintre cele mai bune metode de a comunica rezultatele sunt prin a grafic.
  • Graficele sunt un instrument incredibil de simplificare a analizelor complexe.

Restul acestui tutorial construiește acele grafice cu pachetul ggplot2.

Pachetul ggplot2

Acest tutorial se concentrează pe construirea de diagrame în R cu ggplot2.

În acest tutorial, veți utiliza pachetul ggplot2. Pachetul implementează Gramatica Graficii descrisă de Leland Wilkinson în 2005. ggplot2 este flexibil, vine cu multe teme și vă permite să specificați un grafic la un nivel ridicat de absoarbție.tracție. Rețineți că nu produce grafică tridimensională sau interactivă; acestea necesită pachete precum plotly sau rgl.

În ggplot2, un grafic este compus din următoarele argumente:

  • de date
  • hartă esteticăping
  • obiect geometric
  • transformări statistice
  • cântare
  • sistem de coordonate
  • ajustări de poziție
  • fațetare

Veți învăța cum să controlați aceste argumente în tutorial.

Sintaxa de bază a lui ggplot2 este:

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

Cum se creează un grafic de dispersie în R

Să vedem cum funcționează ggplot cu setul de date mtcars. Începeți prin a reprezenta un grafic de dispersie a variabilei mpg și a variabilei drat.

Graficul de dispersie de bază

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

Code Explicație

  • Mai întâi treceți setul de date mtcars la ggplot.
  • În argumentul aes(), adăugați axa x și axa y.
  • Semnul + înseamnă că doriți ca R să citească în continuare codul. Face codul mai lizibil prin spargerea lui.
  • Utilizați geom_point() pentru obiectul geometric.

ieșire:

Graficul de dispersie de bază

Graficul de dispersie cu grupuri

Uneori, poate fi interesant să distingem valorile după un grup de date (adică date la nivel de factor).

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

Code Explicație

  • Funcția aes() din cadrul funcției geom_point() controlează culoarea fiecărui grup. Funcția grouping variabila trebuie să fie un factor, deci gear este încapsulată în factor().
  • În total, aveți codul aes(culoare = factor(gear)) care schimbă culoarea punctelor.

ieșire:

Graficul de dispersie cu grupuri

Schimbarea scalei axei cu o transformare logaritmică

Rescalarea datelor este o mare parte a muncii de analist, deoarece variabilele brute rareori ajung într-o formă clară de clopot. Utilizarea logaritmilor este o modalitate de a comprima valorile extreme și de a face graficul mai puțin sensibil la valorile aberante.

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

Code Explicație

  • Transformi variabilele x și y în log() direct în interiorul hărții aes()ping.

Rețineți că orice altă transformare poate fi aplicată, cum ar fi standardizarea sau normalizarea.

ieșire:

Schimbați axa

Graficul de dispersie cu valori ajustate

Puteți adăuga un alt nivel de informații graficului. Puteți suprapune valorile ajustate ale unui regresie liniara.

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 Explicație

  • my_graph: graficul este stocat în obiectul my_graph, astfel încât pașii ulteriori pot adăuga straturi fără a repeta întregul apel
  • Argumentul stat_smooth() controlează metoda de netezire
  • metoda = „lm”: regresie liniară
  • col = „#C42126”: Code pentru culoarea roșie a liniei
  • se = FALSE: Nu afișați eroarea standard
  • size = 1: grosimea liniei. În ggplot2 3.4.0 și versiunile ulterioare, acest argument a fost redenumit linewidth pentru geometriile liniilor.

ieșire:

Graficul de dispersie cu valori ajustate

Rețineți că sunt disponibile și alte metode de netezire

  • glm
  • GAM
  • loess: valoarea implicită pentru mai puțin de 1,000 de observații
  • rlm: model liniar robust, din pachetul MASS

Înainte de a stiliza diagrama, merită să știi când o diagramă de dispersie este alegerea potrivită.

Diagramă de dispersie vs. diagramă liniară vs. BubblDiagrama e în R

Toate trei prezintă grafic două variabile continue una în raport cu cealaltă, așa că alegerea se reduce la ceea ce ar trebui să rețină cititorul.

Criterii Graficul de dispersie Linie Chart Bubble Grafic
Emisiuni Corelația dintre două variabile Schimbarea unei variabile pe o axă ordonată Corelație plus o a treia magnitudine
Axa X. Orice variabilă continuă De obicei, timpul sau o altă scală ordonată Orice variabilă continuă
Ordin punctual Irelevant Punctele critice sunt conectate Irelevant
A treia variabilă Prin culoare sau formă Prin linii separate Dimensiunea punctului prin
apel ggplot2 punct_geometric() geom_line() punct_geometru(aes(size = z))

Conectarea punctelor de dispersie cu o linie atunci când axa x nu are o ordine naturală este o greșeală frecventă: implică o secvență care nu există. Rezervați geom_line() pentru axe ordonate, cum ar fi datele. Pentru distribuțiile unei singure variabile, utilizați un box plot in schimb.

Adăugați informații în grafic

Până acum, graficele nu conțin text explicativ. Un cititor ar trebui să poată vedea povestea în datele din grafic, fără a consulta documentație suplimentară, ceea ce înseamnă că graficul are nevoie de etichete corecte. Puteți adăuga etichete cu funcția labs().

Sintaxa de bază pentru labs() este:

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

Adăugați un titlu

O informație obligatorie de adăugat este, evident, un titlu.

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

Code Explicație

  • my_graph: Folosiți graficul pe care l-ați stocat. Evită rescrierea tuturor codurilor de fiecare dată când adăugați informații noi în grafic.
  • Titlul se încadrează în interiorul labs().

ieșire:

Adăugați un titlu

Adăugați un titlu cu un nume dinamic

Un titlu dinamic este util pentru a adăuga informații mai precise în titlu.

Puteți utiliza funcția paste() pentru a imprima text static și text dinamic. Sintaxa de bază a paste() este:

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	

Exemplu:

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

ieșire:

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

ieșire:

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

Puteți adăuga un nume dinamic graficului nostru, și anume media 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 Explicație

  • Creați media mpg cu mean(mtcars$mpg) stocată în variabila mean_mpg
  • Folosiți paste() cu mean_mpg pentru a crea un titlu dinamic care returnează valoarea medie a mpg

ieșire:

Adăugați un titlu cu un nume dinamic

Adăugați un subtitlu

Două detalii suplimentare fac graficul mai explicit. Vorbim despre subtitlu și legendă. Subtitlul se află chiar sub titlu. Legenda poate informa despre cine a efectuat calculul și sursa datelor.

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

Code Explicație

  • În labs(), ai adăugat:
    • title = „Relația dintre Mila pe oră și Drat”: Adăugați titlu
    • subtitle = „Defalcarea relației în funcție de clasa de echipament”: Adăugați subtitrare
    • legenda = „Calcul propriu al autorilor: Adăugați legenda
    • Separați fiecare informație nouă cu o virgulă, ,
  • Rețineți că rupeți liniile de cod. Nu este obligatoriu și ajută doar să citiți mai ușor codul

ieșire:

Adăugați un subtitrare

Redenumiți axa x și axa y

Numele coloanelor sunt rareori gata de prezentare. Acestea sunt adesea abreviate sau folosesc sublinieri între cuvinte, ca în GDP_CAP. Redenumiți-le pe grafic și adăugați unități acolo unde contează.

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 Explicație

  • În labs(), ai adăugat:
    • x = „Definiție Drat”: Schimbați numele axei x
    • y = „Milă pe oră”: Schimbați numele axei y

ieșire:

Redenumiți axa x și axa y

Controlați cântarul

Puteți controla scara axei.

Funcția seq() este convenabilă atunci când trebuie să creați o secvență de numere. Sintaxa de bază este:

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`	

De exemplu, un interval de la 0 la 12 cu un pas de 4 returnează patru numere: 0, 4, 8 și 12.

seq(0, 12,4)

ieșire:

## [1]  0  4  8 12

Puteți controla scara axei x și a axei y ca mai jos

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 Explicație

  • Funcția scale_y_continuous() controlează axa y
  • Funcția scale_x_continuous() controlează axa x.
  • Parametrul breaks controlează împărțirea axei. Puteți adăuga manual secvența de numere sau puteți utiliza funcția seq():
    • seq(1, 3.6, by = 0.2): Creează secvența de la 1 la 3.6 în pași de 0.2, adică 14 puncte de întrerupere
    • seq(1, 1.6, by = 0.1): Creați șapte numere de la 1 la 1.6 în pași de 0.1

ieșire:

Controlați cântarul

Temă

În cele din urmă, ggplot2 vă permite să reechilibrați întreaga grafică cu o singură funcție de temă. Opt teme complete sunt livrate în pachet:

  • theme_bw()
  • theme_light()
  • temă_clasică()
  • theme_linedraw()
  • theme_dark()
  • theme_minimal()
  • theme_gri()
  • 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"
    )

ieșire:

Temă

Salvați parcele

După toți acești pași, este timpul să salvați și să partajați graficul. Apelați comanda ggsave(„numele_fișierului.png”) imediat după reprezentare grafică, iar imaginea este scrisă pe disc.

Graficul este salvat în directorul de lucru. Pentru a verifica directorul de lucru, puteți rula acest cod:

directory <- getwd()
directory

Trasează graficul finalizat, salvează-l și verifică unde a ajuns:

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

ieșire:

Salvați parcele

ggsave("my_fantastic_plot.png")

ieșire:

## Saving 5 x 4 in image

notițe: Numai în scop pedagogic, am creat o funcție numită open_folder() pentru a deschide folderul director pentru dvs. Trebuie doar să rulați codul de mai jos și să vedeți unde este stocată imaginea. Ar trebui să vedeți un fișier cu numele 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)

Cum se creează grafice de dispersie fațetate în R cu facet_wrap()

Fațetarea este una dintre cele opt componente ggplot2 enumerate anterior și este cel mai clar răspuns la o diagramă aglomerată. În loc să înghesuie fiecare grup într-un singur panou, ggplot2 desenează un mic multiplu pentru fiecare nivel al unei variabile, toate la aceleași scări, astfel încât panourile să rămână comparabile.

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

Trei argumente fac cea mai mare parte a muncii.

  • Ncol or nrow: forțează panourile într-un anumit layout, de exemplu facet_wrap(~ gear, ncol = 2).
  • cântare„fix” în mod implicit, astfel încât fiecare panou are același interval de axe. Folosiți „free_y” sau „free” atunci când grupurile diferă foarte mult în magnitudine, dar rețineți că scalele libere fac ca comparația vizuală dintre panouri să fie înșelătoare.
  • labeller: înlocuiește nivelul brut al factorului din fiecare bandă, de exemplu labeller = label_both pentru a afișa „gear: 4” în loc de „4”.

Două grupuriping variabile. Folosește facet_grid() pentru a construi o matrice de panouri, cu prima variabilă pe rânduri și a doua pe coloane:

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

Fațete sau culori? Culoarea funcționează bine până la aproximativ patru grupuri pe o diagramă cu suprapunere limitată. Dincolo de acest aspect, sau ori de câte ori grupurile se suprapun puternic, fațetarea este mai ușor de citit deoarece fiecare panou conține doar propriile puncte. Puteți combina ambele: fațetarea cu o variabilă și culoarea cu alta, ca în exemplul facet_grid() de mai sus.

Cum se gestionează suprapunerea grafică în graficele de dispersie R

Cu câteva zeci de observații, fiecare punct este vizibil. Cu mii, markerii se suprapun unul peste altul, iar regiunea cea mai densă se citește pur și simplu ca o pată solidă. Adică supracomplotși ggplot2 oferă patru remedii standard.

1. Reduceți opacitatea. Cea mai ieftină soluție. Suprapunereping punctele se întunecă în mod natural, astfel încât densitatea devine vizibilă:

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

2. Valori discrete de jitter. Când o variabilă ia doar câteva valori, punctele aterizează pe aceleași coordonate. O mică deplasare aleatorie le separă:

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

Setați înălțimea = 0 astfel încât valorile y, care conțin informațiile reale, să nu fie niciodată modificate.

3. Aruncați avionul la gunoi. Pentru seturi de date mari, numărați observațiile per celulă și mapați numărul la culoare. Secțiunile hexagonale evită artefactele vizuale pe care le produc secțiunile pătrate:

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

4. Desenați contururi de densitate. Liniile de contur conturează regiunile în care se concentrează observațiile și se suprapun perfect peste punctele estompate:

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

Ca regulă generală, alpha gestionează câteva mii de puncte, binning-ul hexagonal gestionează zeci de mii, iar eșantionarea datelor cu dplyr::slice_sample() este opțiunea pragmatică dincolo de aceasta.

Diagramă de dispersie în R: Code Referinţă

Tabelul de mai jos listează apelul ggplot2 pentru fiecare opțiune prezentată mai sus:

Obiectiv Code
Graficul de dispersie de bază
ggplot(df, aes(x = x1, y = y)) + geom_point()
Diagramă de dispersie cu grup de culori
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2)))
Adăugați valori potrivite
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm")
Adauga titlu
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99"))
Adăugați subtitrare
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99"))
Redenumiți x
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1")
Redenumiți y
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1")
Controlați cântarul
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))
Creați jurnalele
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point()
Temă
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic()
Fațetată de un grup
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2)
Gestionarea suprapunerii
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3)
Economisește
ggsave("my_fantastic_plot.png")

Întrebări frecvente

geom_point() desenează fiecare observație la coordonatele sale exacte. geom_jitter() adaugă o mică deplasare aleatorie astfel încât punctele care au aceeași valoare să devină distincte, ceea ce contează atunci când o axă conține valori discrete.

În interiorul funcției aes(), culoarea mapează o variabilă, așadar ggplot2 atribuie o nuanță per nivel și construiește o legendă. În afara funcției aes(), culoarea este o constantă fixă ​​aplicată fiecărui punct și nu apare nicio legendă.

Adăugați stat_smooth(method = “lm”) sau geom_smooth(method = “lm”) după geom_point(). Setați se = FALSE pentru a ascunde banda de încredere și folosiți method = “loess” pentru o netezire neliniară.

Diagramele de dispersie dezvăluie corelația caracteristicilor și valorile aberante înainte de antrenament și reprezintă modalitatea standard de a afișa valorile prezise față de cele reale sau de a vizualiza clusterele după reducerea dimensionalității cu PCA sau t-SNE.

Da. Asistenții inteligenți artificiali pot schița straturi, pot sugera corecții pentru suprapunere și pot explica erori precum lipsa unui wrapper aes(). Rulați codul generat pe propriile date, deoarece numele coloanelor și tipurile de factori pot fi ușor greșite.

Rezumați această postare cu: