Dijagram raspršenja u R-u korištenjem ggplot2 s primjerom

⚡ Pametni sažetak

Dijagram raspršenja u R-u pomoću ggplot2 mapira dvije kontinuirane varijable na x i y osi pomoću geom_point(). Ovaj vodič pokriva grouping po boji, logaritamskim transformacijama, prilagođenim regresijskim linijama, oznakama, fasetiranju, ispravcima preklapanja, skalama, temama i spremanju.

  • ???? Osnovna sintaksa: ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() gradi graf iz podataka, karteping, i geometrija.
  • 🎨 Grupno bojanje: aes(color = factor(gear)) unutar geom_point() dijeli točke u jednu boju po razini faktora.
  • 📈 Linije trenda: stat_smooth(method = “lm”) prekriva prilagođenu regresijsku liniju, a se = FALSE uklanja pojas pouzdanosti.
  • 🗂️ Fasetiranje: facet_wrap() crta jedan panel po grupi na zajedničkoj skali, što je bolje od guranja svake serije u jedan grafikon.
  • 🔁 Prekomjerno crtanje: Smanjite alfu, podesite točke ili prebacite na geom_hex() kada se markeri nagomilaju jedan na drugome.
  • 💾 Izvoz: ggsave(“plot.png”, širina = 8, visina = 5, dpi = 300) zapisuje posljednji graf u radni direktorij.

Dijagram raspršenja u R-u korištenjem ggplot2

Zašto su grafovi važni u analizi podataka

Grafikoni su treći dio procesa analize podataka. Prvi dio je o podaci extracANJE, drugi dio se bavi čišćenje i manipuliranje podacima. Konačno, podatkovni znanstvenik će možda trebati priopćiti svoje rezultate grafički.

Tijek rada znanstvenika podataka sažet je na slici ispod.

  • Prvi zadatak podatkovnog znanstvenika je definiranje istraživačkog pitanja. Ovo istraživačko pitanje ovisi o ciljevima i ciljevima projekta.
  • Nakon toga, jedan od najistaknutijih zadataka je inženjering značajki. Znanstvenik za podatke treba prikupljati, manipulirati i čistiti podatke
  • Kada ovaj korak završi, može početi istraživati ​​skup podataka. Ponekad je potrebno doraditi i promijeniti izvornu hipotezu zbog novog otkrića.

Dijagram raspršenosti u R

  • Kada objašnjenja analiza postignuta, podatkovni znanstvenik mora uzeti u obzir sposobnost čitatelja da razumjeti temeljne koncepte i modele.
  • Njegove rezultate treba predstaviti u obliku koji svi dionici mogu razumjeti. Jedna od najboljih metoda za komunicirati rezultati su kroz a grafikon.
  • Grafikoni su nevjerojatan alat za pojednostavljivanje složene analize.

Ostatak ovog tutorijala gradi te grafove pomoću paketa ggplot2.

Paket ggplot2

Ovaj tutorial se fokusira na izradu grafikona u R-u pomoću ggplot2.

U ovom tutorialu koristit ćete paket ggplot2. Paket implementira Gramatiku grafike koju je opisao Leland Wilkinson 2005. godine. ggplot2 je fleksibilan, dolazi s mnogim temama i omogućuje vam određivanje grafa na visokoj razini apsolutne veličine.tracImajte na umu da ne proizvodi trodimenzionalnu ili interaktivnu grafiku; za to su potrebni paketi poput plotly ili rgl.

U ggplot2, graf se sastoji od sljedećih argumenata:

  • datum
  • estetska kartaping
  • geometrijski objekt
  • statističke transformacije
  • vage
  • koordinatni sustav
  • prilagodbe položaja
  • fasetiranje

U udžbeniku ćete naučiti kako kontrolirati te argumente.

Osnovna sintaksa ggplot2 je:

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

Kako stvoriti dijagram raspršenja u R-u

Pogledajmo kako ggplot radi s mtcars skupom podataka. Počinjete iscrtavanjem dijagrama raspršenosti varijable mpg i varijable drat.

Osnovni dijagram raspršenosti

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

Code Objašnjenje

  • Prvo proslijedite skup podataka mtcars ggplotu.
  • Unutar aes() argumenta dodajete x-os i y-os.
  • Znak + znači da želite da R nastavi čitati kod. Čini kôd čitljivijim razbijanjem.
  • Koristite geom_point() za geometrijski objekt.

Izlaz:

Osnovni dijagram raspršenosti

Raspršeni dijagram sa grupama

Ponekad može biti zanimljivo razlikovati vrijednosti prema skupini podataka (tj. podaci na razini faktora).

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

Code Objašnjenje

  • Funkcija aes() unutar funkcije geom_point() kontrolira boju svake grupe. Grupaping Varijabla mora biti faktor, pa je oprema omotana u faktor().
  • Sve u svemu, imate kod aes(boja = faktor(zupčanik)) koji mijenja boju točaka.

Izlaz:

Raspršeni dijagram s grupama

Promjena skale osi logaritamskom transformacijom

Preskaliranje podataka velik je dio posla analitičara jer sirove varijable rijetko stižu u urednom obliku zvona. Logaritmiranje je jedan od načina za komprimiranje ekstremnih vrijednosti i smanjenje osjetljivosti grafikona na outliere.

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

Code Objašnjenje

  • Varijable x i y transformirate u log() izravno unutar aes() mape.ping.

Imajte na umu da se može primijeniti bilo koja druga transformacija, poput standardizacije ili normalizacije.

Izlaz:

Promjena osi

Dijagram raspršenosti s prilagođenim vrijednostima

Grafu možete dodati još jednu razinu informacija. Možete preklopiti prilagođene vrijednosti Linearna regresija.

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 Objašnjenje

  • my_graph: grafikon je pohranjen u objektu my_graph, tako da kasniji koraci mogu dodati slojeve bez ponavljanja cijelog poziva
  • Argument stat_smooth() kontrolira metodu izglađivanja
  • metoda = “lm”: Linearna regresija
  • stupac = “#C42126”: Code za crvenu boju linije
  • se = FALSE: Ne prikazuj standardnu ​​pogrešku
  • size = 1: debljina linije. U ggplot2 3.4.0 i kasnijim verzijama ovaj je argument preimenovan u linewidth za geometrije linija.

Izlaz:

Raspršeni dijagram s prilagođenim vrijednostima

Imajte na umu da su dostupne i druge metode izglađivanja

  • glm
  • gam
  • les: zadana vrijednost za manje od 1,000 opažanja
  • rlm: robusni linearni model iz MASS paketa

Prije stiliziranja grafikona, vrijedi znati kada je dijagram raspršenja uopće pravi izbor.

Raspršeni dijagram vs. linijski grafikon vs. Bubble Grafikon u R-u

Sva tri prikazuju dvije kontinuirane varijable jednu nasuprot drugoj, tako da izbor ovisi o tome što čitatelj treba zaključiti.

Kriteriji Dijagram raspršenosti Linijski grafikon Bubble Tablica
Predstave Korelacija između dvije varijable Promjena jedne varijable po uređenoj osi Korelacija plus treća magnituda
Os X Bilo koja kontinuirana varijabla Obično vremenska ili neka druga uređena skala Bilo koja kontinuirana varijabla
Redoslijed bodova Nebitno Kritične točke su povezane Nebitno
Treća varijabla Kroz boju ili oblik Kroz odvojene linije Veličina kroz točku
poziv ggplot2 geom_point() geom_line() geom_točka(aes(veličina = z))

Povezivanje točaka raspršenja linijom kada x-os nema prirodni redoslijed česta je pogreška: implicira niz koji ne postoji. Rezervirajte geom_line() za uređene osi poput datuma. Za distribucije jedne varijable koristite dijagram kutije umjesto.

Dodajte informacije na grafikon

Zasad grafikoni ne sadrže objašnjenja. Čitatelj bi trebao moći vidjeti priču samo na temelju podataka iz grafikona, bez konzultiranja dodatne dokumentacije, što znači da grafikonu trebaju dobre oznake. Oznake možete dodati pomoću funkcije labs().

Osnovna sintaksa za labs() je:

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

Dodajte naslov

Jedna obvezna informacija koju treba dodati očito je naslov.

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

Code Objašnjenje

  • my_graph: Vi koristite graf koji ste pohranili. Izbjegava ponovno pisanje svih kodova svaki put kada dodate nove informacije na grafikon.
  • Naslov se omotava unutar labs().

Izlaz:

Dodajte naslov

Dodajte naslov s dinamičnim nazivom

Dinamički naslov je koristan za dodavanje preciznijih informacija u naslov.

Funkciju paste() možete koristiti za ispis statičkog i dinamičkog teksta. Osnovna sintaksa paste() je:

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	

Primjer:

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

Izlaz:

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

Izlaz:

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

Našem grafikonu možete dodati dinamički naziv, naime prosjek 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 Objašnjenje

  • Kreirate prosjek mpg sa mean(mtcars$mpg) pohranjenim u mean_mpg varijabli
  • Koristite paste() sa mean_mpg za stvaranje dinamičkog naslova koji vraća srednju vrijednost mpg

Izlaz:

Dodajte naslov s dinamičkim nazivom

Dodajte podnaslov

Dva dodatna detalja čine graf jasnijim. Govorimo o podnaslovu i opisu. Podnaslov ide odmah ispod naslova. Opis može obavijestiti tko je izvršio izračun i izvor podataka.

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

Code Objašnjenje

  • Unutar labs() funkcije, dodali ste:
    • title = “Odnos između milja po satu i drata”: Dodajte naslov
    • podnaslov = “Raščlamba odnosa prema klasi opreme”: Dodajte podnaslov
    • caption = “Vlastiti proračun autora: Dodajte naslov
    • Svaku novu informaciju odvajate zarezom, ,
  • Imajte na umu da prekidate retke koda. Nije obavezno i ​​samo pomaže lakšem čitanju koda

Izlaz:

Dodajte podnaslov

Preimenujte x-os i y-os

Nazivi stupaca rijetko su spremni za prezentaciju. Često su skraćeni ili se između riječi koriste podcrte, kao u GDP_CAP. Preimenujte ih na grafikonu i dodajte jedinice gdje su važne.

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 Objašnjenje

  • Unutar labs() funkcije, dodali ste:
    • x = “Definicija nacrta”: Promijenite naziv x-osi
    • y = “Milje po satima”: Promijenite naziv y-osi

Izlaz:

Preimenujte x-os i y-os

Kontrolirajte vagu

Možete kontrolirati mjerilo osi.

Funkcija seq() prikladna je kada trebate stvoriti niz brojeva. Osnovna sintaksa je:

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`	

Na primjer, raspon od 0 do 12 s korakom od 4 vraća četiri broja: 0, 4, 8 i 12.

seq(0, 12,4)

Izlaz:

## [1]  0  4  8 12

Možete kontrolirati mjerilo osi x i osi y kao što je prikazano u nastavku

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 Objašnjenje

  • Funkcija scale_y_continuous() kontrolira Y-osa
  • Funkcija scale_x_continuous() kontrolira apscisa.
  • Parametar breaks kontrolira podjelu osi. Možete ručno dodati niz brojeva ili koristiti funkciju seq():
    • seq(1, 3.6, by = 0.2): Kreiraj niz od 1 do 3.6 u koracima od 0.2, odnosno 14 točaka prekida
    • seq(1, 1.6, by = 0.1): Kreiraj sedam brojeva od 1 do 1.6 u koracima od 0.1

Izlaz:

Kontrolirajte vagu

Tema

Konačno, ggplot2 vam omogućuje preoblikovanje cijelog grafa pomoću jedne funkcije teme. Osam kompletnih tema dolazi s paketom:

  • tema_bw()
  • theme_light()
  • klasična_tema()
  • theme_linedraw()
  • tema_tamna()
  • theme_minimal()
  • tema_siva()
  • tema_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"
    )

Izlaz:

Tema

Spremi parcele

Nakon svih ovih koraka, vrijeme je za spremanje i dijeljenje grafa. Pozovite ggsave(“naziv_datoteke.png”) odmah nakon crtanja i slika će biti zapisana na disk.

Grafikon se sprema u radni direktorij. Za provjeru radnog direktorija, možete pokrenuti ovaj kod:

directory <- getwd()
directory

Nacrtajte gotov graf, spremite ga i provjerite gdje je završio:

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

Izlaz:

Spremi parcele

ggsave("my_fantastic_plot.png")

Izlaz:

## Saving 5 x 4 in image

bilješke: Samo u pedagoške svrhe, stvorili smo funkciju koja se zove open_folder() da vam otvori mapu imenika. Samo trebate pokrenuti kod ispod i vidjeti gdje je slika pohranjena. Trebali biste vidjeti naziv datoteke 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)

Kako stvoriti fasetirane dijagrame raspršenja u R-u pomoću facet_wrap()

Fasetiranje je jedna od osam komponenti ggplot2 navedenih ranije i najčišći je odgovor na pretrpani grafikon. Umjesto da svaku grupu sabije u jedan panel, ggplot2 crta mali višekratnik za svaku razinu varijable, sve na istim skalama tako da paneli ostaju usporedivi.

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

Tri argumenta obavljaju većinu posla.

  • ncol or usko: prisilno rasporedi panele u zadani raspored, na primjer facet_wrap(~ gear, ncol = 2).
  • vage: prema zadanim postavkama „fiksno“ tako da svaka ploča dijeli jedan raspon osi. Koristite „free_y“ ili „free“ kada se grupe značajno razlikuju po veličini, ali imajte na umu da slobodne skale čine vizualnu usporedbu između ploča zavaravajućom.
  • Labeller: zamjenjuje razinu sirovog faktora u svakoj traci, na primjer labeller = label_both za ispis „gear: 4“ umjesto „4“.

Dvije grupeping varijable. Koristite facet_grid() za izgradnju matrice panela, s prvom varijablom u redovima, a drugom u stupcima:

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

Fasete ili boje? Boja dobro funkcionira do otprilike četiri grupe na grafikonu s ograničenim preklapanjem. Nakon toga, ili kad god se grupe jako preklapaju, fasetiranje je lakše za čitanje jer svaki panel nosi samo svoje vlastite točke. Možete kombinirati oboje: fasetiranje jednom varijablom i boju drugom, kao u gornjem primjeru facet_grid().

Kako se nositi s preklapanjem u R dijagramima raspršenja

S nekoliko desetaka opažanja svaka točka je vidljiva. S tisućama, markeri se slažu jedan na drugi, a najgušće područje se jednostavno čita kao čvrsta mrlja. To jest pretjerano iscrtavanje, a ggplot2 nudi četiri standardna rješenja.

1. Smanjite neprozirnost. Najjeftiniji popravak. Preklapanjeping točke prirodno potamne, pa gustoća postaje vidljiva:

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

2. Diskretne vrijednosti podrhtavanja. Kada varijabla uzima samo nekoliko vrijednosti, točke se nalaze na istim koordinatama. Razdvaja ih mali slučajni pomak:

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

Postavite visinu = 0 tako da se y vrijednosti, koje nose stvarne informacije, nikada ne mijenjaju.

3. Bacite avion u smeće. Za velike skupove podataka, brojite opažanja po ćeliji i označite broj bojama. Šesterokutni setovi izbjegavaju vizualne artefakte koje proizvode kvadratni setovi:

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

4. Nacrtajte konture gustoće. Konturne linije ocrtavaju područja gdje se opažanja koncentriraju i uredno se preklapaju preko izblijedjelih točaka:

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

Kao opće pravilo, alfa obrađuje nekoliko tisuća točaka, heksagonalno binning obrađuje desetke tisuća, a uzorkovanje podataka pomoću dplyr::slice_sample() je pragmatična opcija nakon toga.

Dijagram raspršenja u R-u: Code Upućivanje

Donja tablica navodi poziv ggplot2 za svaku gore opisanu opciju:

Cilj Code
Osnovni dijagram raspršenosti
ggplot(df, aes(x = x1, y = y)) + geom_point()
Dijagram raspršenja s grupom boja
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2)))
Dodajte prilagođene vrijednosti
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm")
Dodaj Naslov
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99"))
Dodajte podnaslov
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99"))
Preimenuj x
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1")
Preimenuj y
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1")
Kontrolirajte vagu
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))
Stvorite zapise
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point()
Tema
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic()
Aspekt grupe
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2)
Rješavanje preklapanja
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3)
UŠTEDI
ggsave("my_fantastic_plot.png")

Pitanja i odgovori

geom_point() crta svako opažanje na njegovim točnim koordinatama. geom_jitter() dodaje mali slučajni pomak tako da točke koje dijele istu vrijednost postanu prepoznatljive, što je važno kada jedna os sadrži diskretne vrijednosti.

Unutar aes() boje mapiraju varijablu, pa ggplot2 dodjeljuje jednu nijansu po razini i gradi legendu. Izvan aes() boje su fiksna konstanta primijenjena na svaku točku i ne pojavljuje se legenda.

Dodajte stat_smooth(method = “lm”) ili geom_smooth(method = “lm”) nakon geom_point(). Postavite se = FALSE da biste sakrili pojas pouzdanosti i koristite method = “loess” za nelinearno zaglađivanje.

Dijagrami raspršenja otkrivaju korelaciju značajki i outliere prije treniranja, te su standardni način prikaza predviđenih u odnosu na stvarne vrijednosti ili vizualizacije klastera nakon smanjenja dimenzionalnosti pomoću PCA ili t-SNE.

Da. AI asistenti mogu skicirati slojeve, predložiti ispravke preopterećaja i objasniti pogreške poput nedostajućeg aes() omotača. Pokrenite generirani kod na vlastitim podacima, jer je lako pogriješiti u nazivima stupaca i vrstama faktora.

Sažmite ovu objavu uz: