Geoms (geometriske objekter)

I ggplot2 lages en graf ved å deklarere geoms, som er den engelske forkortelsen for geometriske objekter. Geoms deklareres sekvensielt; en graf kan dermed inneholde mange geoms som visualiserer data. Hver geom har mer eller mindre intuitive navn. Funksjonen geom_bar() lager stolpediagrammer; geom_line() lager linjer; geom_hline() lager horisontale linjer; geom_boxplot() lager boksplott, osv. Listen nedenfor viser de vanligste geometriske objektene med lenker til dokumentasjonen. Funksjonenes navn angir hva de visualiserer.

[geom_abline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_hline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_vline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_bar()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_col()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [stat_count()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [stat_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [geom_blank()](https://ggplot2.tidyverse.org/reference/geom_blank.html) [geom_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [stat_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [geom_contour()](https://ggplot2.tidyverse.org/reference/geom_contour.html) [geom_abline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_hline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_vline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_bar()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_col()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [stat_count()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [stat_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [geom_blank()](https://ggplot2.tidyverse.org/reference/geom_blank.html) [geom_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [stat_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [geom_contour()](https://ggplot2.tidyverse.org/reference/geom_contour.html) [geom_contour_filled()](https://ggplot2.tidyverse.org/reference/geom_contour.html) [stat_contour()](https://ggplot2.tidyverse.org/reference/geom_contour.html) stat_contour_filled() [geom_count()](https://ggplot2.tidyverse.org/reference/geom_count.html) [stat_sum()](https://ggplot2.tidyverse.org/reference/geom_count.html) [geom_density()](https://ggplot2.tidyverse.org/reference/geom_density.html) [stat_density()](https://ggplot2.tidyverse.org/reference/geom_density.html) [geom_density_2d()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [geom_density_2d_filled()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [stat_density_2d()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [stat_density_2d_filled()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [geom_dotplot()](https://ggplot2.tidyverse.org/reference/geom_dotplot.html) [geom_errorbarh()](https://ggplot2.tidyverse.org/reference/geom_errorbarh.html) [geom_function()](https://ggplot2.tidyverse.org/reference/geom_function.html) [stat_function()](https://ggplot2.tidyverse.org/reference/geom_function.html) [geom_hex()](https://ggplot2.tidyverse.org/reference/geom_hex.html) [stat_bin_hex()](https://ggplot2.tidyverse.org/reference/geom_hex.html) [geom_freqpoly()](https://ggplot2.tidyverse.org/reference/geom_histogram.html) [geom_histogram()](https://ggplot2.tidyverse.org/reference/geom_histogram.html) [stat_bin()](https://ggplot2.tidyverse.org/reference/geom_histogram.html) [geom_jitter()](https://ggplot2.tidyverse.org/reference/geom_jitter.html) [geom_crossbar()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_errorbar()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_linerange()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_pointrange()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_map()](https://ggplot2.tidyverse.org/reference/geom_map.html) [geom_path()](https://ggplot2.tidyverse.org/reference/geom_path.html) [geom_line()](https://ggplot2.tidyverse.org/reference/geom_path.html) geom_step() geom_point() [geom_polygon()](https://ggplot2.tidyverse.org/reference/geom_polygon.html) [geom_qq_line()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [stat_qq_line()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [geom_qq()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [stat_qq()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [geom_quantile()](https://ggplot2.tidyverse.org/reference/geom_quantile.html) [stat_quantile()](https://ggplot2.tidyverse.org/reference/geom_quantile.html) [geom_ribbon()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html) [geom_area()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html) [stat_align()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html) [geom_rug()](https://ggplot2.tidyverse.org/reference/geom_rug.html) [geom_segment()](https://ggplot2.tidyverse.org/reference/geom_segment.html) [geom_curve()](https://ggplot2.tidyverse.org/reference/geom_segment.html) [geom_smooth()](https://ggplot2.tidyverse.org/reference/geom_smooth.html) [stat_smooth()](https://ggplot2.tidyverse.org/reference/geom_smooth.html) [geom_spoke()](https://ggplot2.tidyverse.org/reference/geom_spoke.html) [geom_label()](https://ggplot2.tidyverse.org/reference/geom_text.html) [geom_text()](https://ggplot2.tidyverse.org/reference/geom_text.html) [geom_raster()](https://ggplot2.tidyverse.org/reference/geom_tile.html) [geom_rect()](https://ggplot2.tidyverse.org/reference/geom_tile.html) [geom_tile()](https://ggplot2.tidyverse.org/reference/geom_tile.html) [geom_violin()](https://ggplot2.tidyverse.org/reference/geom_violin.html) [stat_ydensity()](https://ggplot2.tidyverse.org/reference/geom_violin.html)

Estetisk mapping av geometriske objekter

Et geometrisk objekt må vite hva som skal visualiseres. Dette gjøres gjennom estetisk mapping, der for eksempel data for x-akse, y-akse osv. spesifiseres. Estetisk mapping defineres med funksjonen aes(). En geom kan arve den estetiske mappingen fra hovedkallet i ggplot(), eller man kan deklarere den i det geometriske objektet. Prinsippet er at en geom alltid arver aes() fra ggplot() med mindre noe annet er spesifisert i geom. Nedenfor lages to identiske grafer ved å spesifisere aes() i henholdsvis ggplot() og geom_point(), som lager et spredningsdiagram (eng. scatter plot):

## aes() spesifiseres i ggplot()
ggplot(data=mpg, aes(x = displ, y = hwy)) +
  geom_point()

## aes() spesifiseres i geom_point()
ggplot(data=mpg) +
  geom_point(aes(x = displ, y = hwy))
Spredningsdiagram av motorvolum (displ) mot drivstofforbruk (hwy) i datasettet mpg
Spredningsdiagram av motorvolum (displ) mot drivstofforbruk (hwy) i datasettet mpg

Geometriske objekter defineres i lag

Du kan visualisere flere geometriske objekter i én graf ved å deklarere dem sekvensielt. Etter at et geometrisk objekt er deklarert, må det avsluttes med + og et linjeskift for å fortsette å deklarere objekter eller innstillinger. Nedenfor brukes data fra mpg for å visualisere sammenhengen mellom motorens volum (displ) og drivstofforbruk (hwy) med to ulike geometriske objekter. Det første objektet er geom_point(), som lager et spredningsdiagram for datapunktene. Det andre objektet er geom_smooth(), som automatisk beregner en fleksibel regresjonslinje for datapunktene; denne fanger opp lineære og ikke-lineære mønstre i data.

ggplot(data = mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  geom_smooth()
Spredningsdiagram av displ mot hwy med fleksibel blå regresjonslinje og grått konfidensbånd fra geom_smooth

Merk at hvert geometrisk objekt arvet estetisk mapping (aes()) fra ggplot(). Merk også at punktene ligger under regresjonslinjen (blå linje), noe som skyldes at geom_point() ble deklarert først i koden ovenfor.

Alle geometriske funksjoner har et aes()-argument, noe som betyr at den estetiske mappingen i stedet kan deklareres i det geometriske objektet. Koden nedenfor gir en tilsvarende graf som den ovenfor, men her deklareres aes() i stedet i hver geom:

ggplot(data = mpg) +
  geom_point(aes(x = displ, y = hwy)) +
  geom_smooth(aes(x = displ, y = hwy))
Spredningsdiagram av displ mot hwy med fleksibel blå regresjonslinje og grått konfidensbånd fra geom_smooth

En estetisk mapping kommer til uttrykk på ulike måter i ulike geoms. Det illustreres nedenfor ved å mappe variabelen class (kjøretøytype) til argumentet color i aes(). For geom_point() vil dette føre til at datapunktene fargekodes etter kjøretøytype. For geom_smooth() vil det bety at separate regresjonslinjer beregnes og fargekodes (med de samme fargene):

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth()
Spredningsdiagram av displ mot hwy fargekodet etter kjøretøytype (class) med én fleksibel regresjonslinje per kjøretøytype

Vi kan ignorere aes() i ggplot() (linje 1) og spesifisere en separat aes() i geom_smooth() (linje 3). Nedenfor gjøres dette ved å mappe color til kjøretøyets drivlinje (drv).

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth(aes(color=drv))
Spredningsdiagram av displ mot hwy fargekodet etter class, regresjonslinjer per drivlinje (drv) i samme fargeforklaring

Dessverre ser vi at når både class og drv mappes til color, får vi én (i stedet for to) fargeforklaringer til høyre. Det gjør at fargekodene for drv (4, f, r) presenteres i samme kolonne som fargekodene for class (2seater, compact, midsize, etc). Dette kan skape tvetydighet ved tolkning av grafen. For å unngå dette må vi mappe drv til et annet argument i aes(). I dette tilfellet kan vi mappe drv til linetype, som er linjetype. Da får hvert nivå i drv sin egen linjetype. Merk også at vi spesifiserer se=FALSE for å fjerne konfidensintervallet for linjene samt method="lm", som viser en lineær regresjonslinje i stedet for en fleksibel linje (disse tilleggene gjøres for at grafen skal bli tydeligere):

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth(aes(linetype=drv), se=FALSE, method="lm")
Spredningsdiagram av displ mot hwy fargekodet etter class med lineære regresjonslinjer der linjetypen angir drivlinje (drv)

Det lyktes! Kan du se om sammenhengen mellom displ og hwy varierer med ulike kombinasjoner av suv og drv?

Et geometrisk objekt kan bruke en undergruppe av datasettet. La oss lage grafen ovenfor på nytt og bare vise regresjonslinjen for biler i klassen pickup:

ggplot(data = mpg, aes(x = displ,
                       y = hwy,
                       color=class)) +
  geom_point() +
  geom_smooth(data=filter(mpg, class=="pickup"))
Spredningsdiagram av displ mot hwy fargekodet etter class med fleksibel regresjonslinje bare for pickup-biler

På samme måte kan vi lage et geometrisk objekt for å fremheve en del av dataene. Vi gjør nå følgende:

  1. Linje 8: Legg til en geom_point() bare med pickup-biler, med svarte punkter i størrelse 4,5.

  2. Linje 9: Legg til en geom_point() bare med pickup-biler, i størrelse 2,5. Disse vil arve color=class fra ggplot().

  3. Linje 12: En geom_smooth() bare med pickup-biler.

ggplot(data = mpg, aes(x = displ,
                       y = hwy,
                       color=class)) +
  # Alle datapunktene
  geom_point() +

  # Datapunkter for pickup-biler
  geom_point(data=filter(mpg, class=="pickup"), size=4.5, color="black") +
  geom_point(data=filter(mpg, class=="pickup"), size=2.5) +

  # Linje for pickup-biler
  geom_smooth(data=filter(mpg, class=="pickup"))
Spredningsdiagram av displ mot hwy der pickup-biler fremheves med større svartkantede punkter og egen regresjonslinje

Hensikten med dette er å fokusere grafen på pickup-biler. Punkter med størrelse 2,5 deklareres etter punkter med størrelse 4,5, slik at de mindre punktene havner oppå de store. Objektet geom_smooth() deklareres aller sist og havner derfor helt fremst i grafen.