Spridningsdiagram i R med ggplot2 med exempel
⚡ Smart sammanfattning
Spridningsdiagram i R med ggplot2 mappar två kontinuerliga variabler till x- och y-axlarna med geom_point(). Denna genomgång täcker grupperping med hjälp av färg, logaritmiska transformationer, anpassade regressionslinjer, etiketter, fasettering, överplottningsfixar, skalor, teman och sparande.
Varför grafer är viktiga i dataanalys
Grafer är den tredje delen av processen för dataanalys. Den första delen handlar om dataextraction, den andra delen behandlar rensa och manipulera data. Äntligen kan dataforskaren behöva kommunicera sina resultat grafiskt.
En data scientists arbetsflöde sammanfattas i bilden nedan.
- Den första uppgiften för en dataforskare är att definiera en forskningsfråga. Denna forskningsfråga beror på projektets mål och mål.
- Därefter är en av de mest framträdande uppgifterna funktionstekniken. Dataforskaren behöver samla in, manipulera och rensa data
- När detta steg är klart kan han börja utforska datamängden. Ibland är det nödvändigt att förfina och ändra den ursprungliga hypotesen på grund av en ny upptäckt.
- När förklarande analys uppnås måste datavetaren överväga läsarens kapacitet att förstå de bakomliggande koncepten och modellerna.
- Hans resultat bör presenteras i ett format som alla intressenter kan förstå. En av de bästa metoderna att kommunicera resultatet är genom en diagram.
- Grafer är ett otroligt verktyg för att förenkla komplex analys.
Resten av den här handledningen bygger dessa grafer med ggplot2-paketet.
ggplot2-paketet
Den här handledningen fokuserar på att bygga diagram i R med ggplot2.
I den här handledningen ska du använda ggplot2-paketet. Paketet implementerar den grafikgrammatik som beskrevs av Leland Wilkinson år 2005. ggplot2 är flexibelt, levereras med många teman och låter dig specificera ett plott på en hög abs-nivå.tracObservera att den inte producerar tredimensionell eller interaktiv grafik; de kräver paket som plotly eller rgl.
I ggplot2 är en graf sammansatt av följande argument:
- datum
- estetisk kartaping
- geometriska objekt
- statistiska transformationer
- skalor
- koordinatsystem
- lägesjusteringar
- fasettering
Du kommer att lära dig hur du kontrollerar dessa argument i handledningen.
Den grundläggande syntaxen för ggplot2 är:
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()`
Hur man skapar ett punktdiagram i R
Låt oss se hur ggplot fungerar med mtcars dataset. Du börjar med att plotta en scatterplot av mpg-variabeln och drat-variabeln.
Grundläggande scatter plot
library(ggplot2) ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point()
Code Förklaring
- Du skickar först datasetet mtcars till ggplot.
- Inuti aes()-argumentet lägger du till x-axeln och y-axeln.
- Tecknet + betyder att du vill att R ska fortsätta läsa koden. Det gör koden mer läsbar genom att bryta den.
- Använd geom_point() för det geometriska objektet.
Produktion:
Scatter plot med grupper
Ibland kan det vara intressant att särskilja värdena med en grupp data (dvs. data på faktornivå).
ggplot(mtcars, aes(x = mpg, y = drat)) + geom_point(aes(color = factor(gear)))
Code Förklaring
- aes() inuti geom_point() styr färgen på varje grupp. Grouping variabeln måste vara en faktor, så växeln är inkapslad i factor().
- Sammantaget har du koden aes(color = factor(gear)) som ändrar färgen på prickarna.
Produktion:
Ändra axelskalan med en logaritmisk transformation
Att skala om data är en stor del av analytikerjobbet, eftersom rådiabler sällan anländer i en snygg klockform. Att ta logaritmer är ett sätt att komprimera extremvärden och göra diagrammet mindre känsligt för extremvärden.
ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear)))
Code Förklaring
- Du transformerar x- och y-variablerna i log() direkt inuti aes()-mappningen.ping.
Observera att vilken annan transformation som helst kan tillämpas såsom standardisering eller normalisering.
Produktion:
Spridningsdiagram med anpassade värden
Du kan lägga till ytterligare en informationsnivå i grafen. Du kan lägga över de anpassade värdena för en linjär regression.
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 Förklaring
- my_graph: plotten lagras i objektet my_graph, så senare steg kan lägga till lager utan att upprepa hela anropet
- Argumentet stat_smooth() styr för utjämningsmetoden
- metod = "lm": Linjär regression
- kolumn = "#C42126": Code för linjens röda färg
- se = FALSK: Visa inte standardfelet
- size = 1: linjens tjocklek. I ggplot2 3.4.0 och senare döptes detta argument om till linewidth för linjegeometrier.
Produktion:
Observera att andra utjämningsmetoder finns tillgängliga
- glm
- GAM
- löss: standardvärdet för färre än 1 000 observationer
- rlm: robust linjär modell, från MASS-paketet
Innan du utformar diagrammet är det värt att veta när ett spridningsdiagram är rätt val överhuvudtaget.
Spridningsdiagram vs. linjediagram vs. Bubble-diagram i R
Alla tre plottar två kontinuerliga variabler mot varandra, så valet beror på vad läsaren ska ta med sig.
| Kriterier | Scatter tomt | Linjediagram | Bubble diagram |
|---|---|---|---|
| Visar | Korrelation mellan två variabler | Förändring av en variabel över en ordnad axel | Korrelation plus en tredje magnitud |
| X-axel | Vilken kontinuerlig variabel som helst | Vanligtvis tid eller annan ordnad skala | Vilken kontinuerlig variabel som helst |
| Punktorder | irrelevant | Kritiska punkter är sammankopplade | irrelevant |
| Tredje variabeln | Genom färg eller form | Genom separata linjer | Genomgående punktstorlek |
| ggplot2-anrop | geom_point() | geom_linje() | geom_point(aes(storlek = z)) |
Att koppla spridningspunkter med en linje när x-axeln inte har någon naturlig ordning är ett vanligt misstag: det antyder en sekvens som inte existerar. Reservera geom_line() för ordnade axlar som datum. För fördelningar av en enda variabel, använd en box tomt istället.
Lägg till information till grafen
Hittills har graferna ingen förklarande text. En läsare bör kunna se händelseförloppet i data från enbart diagrammet, utan att konsultera ytterligare dokumentation, vilket innebär att diagrammet behöver bra etiketter. Du kan lägga till etiketter med labs()-funktionen.
Den grundläggande syntaxen för labs() är:
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")
Lägg till en titel
En obligatorisk information att lägga till är uppenbarligen en titel.
my_graph +
labs(
title = "Plot Mile per hours and drat, in log"
)
Code Förklaring
- my_graph: Du använder grafen du lagrade. Det undviker att skriva om alla koder varje gång du lägger till ny information i grafen.
- Du slår in titeln i labs().
Produktion:
Lägg till en titel med ett dynamiskt namn
En dynamisk titel är användbar för att lägga till mer exakt information i titeln.
Du kan använda funktionen paste() för att skriva ut statisk text och dynamisk text. Den grundläggande syntaxen för paste() är:
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
Exempel:
A <- 2010
paste("The first year is", A)
Produktion:
## [1] "The first year is 2010"
B <- 2018
paste("The first year is", A, "and the last year is", B)
Produktion:
## [1] "The first year is 2010 and the last year is 2018"
Du kan lägga till ett dynamiskt namn till vår graf, nämligen genomsnittet 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 Förklaring
- Du skapar medelvärdet av mpg med mean(mtcars$mpg) lagrad i mean_mpg variabel
- Du använder paste() med mean_mpg för att skapa en dynamisk titel som returnerar medelvärdet för mpg
Produktion:
Lägg till en undertext
Två ytterligare detaljer gör grafen mer tydlig. Du talar om underrubriken och bildtexten. Underrubriken placeras precis under rubriken. Bildtexten kan informera om vem som gjorde beräkningen och datakällan.
my_graph +
labs(
title =
"Relation between Mile per hours and drat",
subtitle =
"Relationship break down by gear class",
caption = "Authors own computation"
)
Code Förklaring
- Inuti labs() lade du till:
- title = "Relation mellan Mile per hours och drat": Lägg till titel
- subtitle = "Relationsuppdelning efter växelklass": Lägg till underrubrik
- caption = “Författarens egen beräkning: Lägg till bildtext
- Du separerar varje ny information med ett kommatecken, ,
- Observera att du bryter kodraderna. Det är inte obligatoriskt, och det hjälper bara att läsa koden lättare
Produktion:
Byt namn på x-axeln och y-axeln
Kolumnnamn är sällan presentationsklara. De förkortas ofta eller använder understreck mellan ord, som i GDP_CAP. Byt namn på dem i diagrammet och lägg till enheter där de är relevanta.
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 Förklaring
- Inuti labs() lade du till:
- x = "Drat definition": Ändra namnet på x-axeln
- y = "Mile per hours": Ändra namnet på y-axeln
Produktion:
Kontrollera vågen
Du kan styra axelns skala.
Funktionen seq() är praktisk när du behöver skapa en talföljd. Grundsyntaxen är:
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`
Till exempel returnerar ett intervall från 0 till 12 med steget 4 fyra tal: 0, 4, 8 och 12.
seq(0, 12,4)
Produktion:
## [1] 0 4 8 12
Du kan styra skalan för x-axeln och y-axeln enligt nedan
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 Förklaring
- Funktionen scale_y_continuous() styr y-axeln
- Funktionen scale_x_continuous() styr x-axeln.
- Parameterbrytningarna styr axeldelningen. Du kan manuellt lägga till nummersekvensen eller använda seq()-funktionen:
- seq(1, 3.6, by = 0.2): Skapa sekvensen från 1 till 3.6 i steg om 0.2, det vill säga 14 brytpunkter
- seq(1, 1.6, by = 0.1): Skapa sju tal från 1 till 1.6 i steg om 0.1
Produktion:
tema
Slutligen låter ggplot2 dig omforma hela plotten med en enda temafunktion. Åtta kompletta teman medföljer paketet:
- theme_bw()
- theme_light()
- tema_klassisk()
- theme_linedraw()
- theme_dark()
- theme_minimal()
- theme_grey()
- 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"
)
Produktion:
Spara tomter
Efter alla dessa steg är det dags att spara och dela din graf. Anropa ggsave(“namn_på_filen.png”) direkt efter att du har ritat den så skrivs bilden till disken.
Grafen sparas i arbetskatalogen. För att kontrollera arbetskatalogen kan du köra den här koden:
directory <- getwd() directory
Rita ut den färdiga grafen, spara den och kontrollera var den landade:
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"
)
Produktion:
ggsave("my_fantastic_plot.png")
Produktion:
## Saving 5 x 4 in image
Anmärkningar: Endast för pedagogiska ändamål skapade vi en funktion som heter open_folder() för att öppna katalogmappen åt dig. Du behöver bara köra koden nedan och se var bilden är lagrad. Du bör se en fil med namnet 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)
Hur man skapar fasetterade punktdiagram i R med facet_wrap()
Fasettering är en av de åtta ggplot2-komponenterna som listats tidigare, och det är det renaste svaret på ett trångt diagram. Istället för att klämma in varje grupp i en panel, ritar ggplot2 en liten multipel för varje nivå av en variabel, alla på samma skalor så att panelerna förblir jämförbara.
# One panel per gear count ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() + facet_wrap(~ gear) + theme_classic()
Tre argument gör det mesta av jobbet.
- ncol or trångatvinga panelerna in i en given layout, till exempel facet_wrap(~ gear, ncol = 2).
- skalor: ”fast” som standard så att varje panel delar ett axelområde. Använd ”free_y” eller ”free” när grupperna skiljer sig kraftigt åt i storlek, men var medveten om att fria skalor gör visuella jämförelser mellan paneler missvisande.
- etiketteringsersätter råfaktornivån i varje remsa, till exempel labeller = label_both för att skriva ut "gear: 4" istället för "4".
Två grupperping variabler. Använd facet_grid() för att bygga en matris av paneler, med den första variabeln över rader och den andra över kolumner:
ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point(aes(color = factor(cyl))) + facet_grid(am ~ gear) + theme_classic()
Fasetter eller färger? Färg fungerar bra upp till ungefär fyra grupper i ett diagram med begränsad överlappning. Utöver det, eller när grupperna överlappar varandra kraftigt, är fasettering lättare att läsa eftersom varje panel bara har sina egna punkter. Du kan kombinera båda: fasettering med en variabel och färg med en annan, som i facet_grid()-exemplet ovan.
Hur man hanterar överplottning i R-spridningsdiagram
Med några dussin observationer är varje punkt synlig. Med tusentals staplas markörer ovanpå varandra och det tätaste området läses helt enkelt som en hel klump. Det vill säga överplotting, och ggplot2 erbjuder fyra standardlösningar.
1. Minska opaciteten. Den billigaste lösningen. Överlappningping punkterna mörknar naturligt, så densiteten blir synlig:
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + theme_classic()
2. Diskreta värden för jitter. När en variabel bara antar ett fåtal värden landar punkterna på samma koordinater. En liten slumpmässig förskjutning separerar dem:
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) + geom_jitter(width = 0.15, height = 0) + theme_classic()
Sätt höjden = 0 så att y-värdena, som innehåller den verkliga informationen, aldrig ändras.
3. Kassera planet. För stora datamängder, räkna observationer per cell och mappa antalet till färg. Hexagonala fält undviker de visuella artefakter som fyrkantiga fält producerar:
ggplot(diamonds, aes(x = carat, y = price)) + geom_hex(bins = 40) + theme_classic()
4. Rita densitetskonturer. Konturlinjer beskriver de områden där observationerna koncentreras, och de lager sig prydligt över bleka punkter:
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + geom_density_2d(color = "#C42126") + theme_classic()
Som en tumregel hanterar alfa några tusen punkter, hexagonal binning hanterar tiotusentals, och att sampla data med dplyr::slice_sample() är det pragmatiska alternativet utöver det.
Spridningsdiagram i R: Code Hänvisning
Tabellen nedan listar ggplot2-anropet för varje alternativ som behandlas ovan:
| Mål | Code |
|---|---|
| Grundläggande scatter plot |
ggplot(df, aes(x = x1, y = y)) + geom_point() |
| Spridningsdiagram med färggrupp |
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2))) |
| Lägg till inpassade värden |
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm") |
| Lägg till titel |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99")) |
| Lägg till undertext |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99")) |
| Byt namn på x |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1") |
| Byt namn på y |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1") |
| Kontrollera vågen |
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)) |
| Skapa loggar |
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point() |
| tema |
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic() |
| Facett av en grupp |
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2) |
| Hantera överplottning |
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3) |
| Spara |
ggsave("my_fantastic_plot.png")
|













