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.

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












