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.

  • 📍 Bassyntax: ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() bygger plotten från data, kartapingoch geometri.
  • 🎨 Gruppfärgning: aes(color = factor(gear)) inuti geom_point() delar upp punkterna i en färg per faktornivå.
  • 📈 Trendlinjer: stat_smooth(method = “lm”) lägger en anpassad regressionslinje över varandra, och se = FALSE tar bort konfidensbandet.
  • 🗂️ Fasettering: facet_wrap() ritar en panel per grupp på en delad skala, vilket slår att man måste samla alla serier i ett enda diagram.
  • 🔁 Överplottning: Sänk alfa, få punkterna att vibrera eller byt till geom_hex() när markörer staplas på varandra.
  • 💾 Exportera: ggsave("plot.png", width = 8, height = 5, dpi = 300) skriver det sista diagrammet till arbetskatalogen.

Spridningsdiagram i R med ggplot2

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.

Scatter Plot i R

  • 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:

Grundläggande spridningsdiagram

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:

Scatter Plot med grupper

Ä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:

Byt axel

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:

Scatter Plot med anpassade värden

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

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 titel med ett dynamiskt namn

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:

Lägg till en undertext

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:

Byt namn på x-axel och y-axel

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:

Kontrollera vågen

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:

tema

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:

Spara tomter

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

Vanliga frågor

geom_point() ritar varje observation vid dess exakta koordinater. geom_jitter() lägger till en liten slumpmässig förskjutning så att punkter som delar samma värde blir urskiljbara, vilket är viktigt när en axel har diskreta värden.

Inuti aes() mappar färg en variabel, så ggplot2 tilldelar en nyans per nivå och skapar en förklaring. Utanför aes() är färg en fast konstant som tillämpas på varje punkt, och ingen förklaring visas.

Lägg till stat_smooth(method = “lm”) eller geom_smooth(method = “lm”) efter geom_point(). Sätt se = FALSE för att dölja konfidensbandet och använd method = “loess” för en icke-linjär utjämnare.

Spridningsdiagram visar funktionskorrelation och extremvärden före träning, och de är standardsättet att visa predikterade mot faktiska värden eller för att visualisera kluster efter dimensionalitetsreduktion med PCA eller t-SNE.

Ja. AI-assistenter kan utarbeta lager, föreslå korrigeringar för överplottning och förklara fel som en saknad aes()-omslag. Kör den genererade koden på dina egna data, eftersom kolumnnamn och faktortyper är lätta att få fel.

Sammanfatta detta inlägg med: