I ggplot2 skapas en graf genom att deklarera geoms, som är den engelska förkortningen för geometriska objekt. Geoms deklareras sekventiellt; en graf kan således innehålla många geoms som visualiserar data. Varje geom har mer eller mindre intuitiva namn. Funktionen geom_bar()
skapar stapeldiagram; geom_line()
skapar linjer; geom_hline()
skapar horisontella linjer; geom_boxplot()
skapar boxplots, osv. Listan nedan redovisar de vanligaste geometriska objekten med länkar till dokumentationen. Funktionernas namn indikerar vad de visualiserar.
Estetisk mappning av geometriska objekt
Ett geometriskt objekt måste vad som skall visualiseras. Detta görs genom estetisk mapping, där exempelvis data för x-axel, y-axel, etc, specificeras. Estetisk mappning definieras med funktionen aes()
. En geom kan ärva den estetiska mappningen från huvudanropet i ggplot()
, eller genom att deklarera detta i det geometriska objektet. Principen är att ett geom alltid ärver aes()
från ggplot()
om inte annat specificeras i geom. Nedan skapas två identiska grafer genom att specificera aes()
i ggplot()
respektive i geom_point()
, som skapar ett spridningsdiagram (eng. scatter plot):
# aes() specificeras i ggplot()
ggplot(data=mpg, aes(x = displ, y = hwy)) +
geom_point()
# aes() specificeras i geom_point()
ggplot(data=mpg) +
geom_point(aes(x = displ, y = hwy))
Geometriska objekt definieras i lager
Du kan visualisera flera geometriska objekt i en graf genom att deklarera dem sekventiellt. Efter ett geometriska objekt deklarerats måste det avslutas med +
och en radbrytning göras för att fortsätta deklarera objekt eller inställningar. Nedan används data från mpg
för att visualisera sambandet mellan motorns volym (displ
) och bränsleförbrukning (hwy
) med två olika geometriska objekt. Det första objektet är geom_point()
som skapar ett spridningsdiagram för datapunkterna. Det andra objektet är geom_smooth()
som automatiskt beräknar en flexibel regressionslinje för datapunkterna; denna fångar linjära och icke-linjära mönster i data.
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Notera att varje geometriskt objekt ärvde estetisk mappning (aes()
) från ggplot()
. Notera också att punkterna ligger under regressionslinjen (blå linje), vilket beror på geom_point()
deklarerades först i koden ovan.
Alla geometriska funktioner har ett aes()
argument, vilket innebär att den estetiska mappningen kan deklareras i det geometriska objektet istället. Nedanstående kod resulterar i en likadan graf som ovanstående, men här deklareras aes()
istället i varje geom:
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
En estetisk mappning yttrar sig på olika vis i olika geoms. Det illustreras här nedan genom att mappa variabeln class
(fordonstyp) till argumentet color
i aes()
. För geom_point()
kommer detta resultera i att datapunkterna färgkodas efter fordonstyp. För geom_smooth()
kommer det innebära att separata regressionslinjer beräknas och färgkodas (med samma färger):
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Vi kan ignorera aes()
i ggplot()
(rad 1) och specificera en separat aes()
i geom_smooth()
(rad 3). Nedan görs detta genom att mappa color till fordonets drivlina (drv).
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Tyvärr ser vi att när både class
och drv
mappas till color
så får en (istället för två) färgförklaringar till höger. Det gör att färgkoder för drv
(4, f, r) presenteras i samma kolumn som färgkoder för class
(2seater, compact, midsize, etc). Detta kan skapa tvetydighet vid tolkning av grafen. För att undkomma detta behöver vi mappa drv
till ett annat argument i aes()
. I detta fall kan vi mappa drv
till linetype
, som är typ av linje. Då får varje nivå i drv
en egen typ av linje. Notera också att vi specificerar se=FALSE
för att ta bort konfidensintervallet för linjerna samt method="lm"
som presenterar en linjär regressionslinje istället för en flexibel linje (dessa tillägg görs för att grafen ska bli tydligare):
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Det lyckades! Kan du se om sambandet mellan displ
och hwy
varierar med olika kombinationer av suv
och drv
?
Ett geometriskt objekt kan använda en subgrupp i datamängden. Låt oss göra om ovanstående graf och endast visa regressionslinjen för bilar av klassen pickup:
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
På samma vis kan vi skapa ett geometriskt objekt för att förstärka en del av data. Vi gör nu följande:
- Rad 8: Lägg till en
geom_point()
endast med pickup-bilar, med svarta punkter i storlek 4.5. - Rad 9: Lägg till en
geom_point()
endast med pickup-bilar, i storlek 2.5. Dessa kommer ärvacolor=class
frånggplot()
. - Rad 12: En
geom_smooth()
endast med pickup-bilar.
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Syftet med detta är att fokusera grafen på pickup-bilar. Punkter med storlek 2.5 deklareras efter punkter med storlek 4.5, så de mindre punkterna hamnar ovanpå de stora. Objektet geom_smooth()
deklareras allra sist och hamnar därför längst fram i grafen.