Geoms (geometriske objekter)

I ggplot2 oprettes en graf ved at deklarere geoms, som er den engelske forkortelse for geometriske objekter. Geoms deklareres sekventielt; en graf kan således indeholde mange geoms, der visualiserer data. Hver geom har mere eller mindre intuitive navne. Funktionen geom_bar() laver søjlediagrammer; geom_line() laver linjer; geom_hline() laver vandrette linjer; geom_boxplot() laver boxplots osv. Listen nedenfor viser de mest almindelige geometriske objekter med links til dokumentationen. Funktionernes navne angiver, hvad 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)

Æstetisk mapping af geometriske objekter

Et geometrisk objekt skal vide, hvad der skal visualiseres. Dette gøres gennem æstetisk mapping, hvor eksempelvis data for x-akse, y-akse osv. specificeres. Æstetisk mapping defineres med funktionen aes(). En geom kan arve den æstetiske mapping fra hovedkaldet i ggplot() eller ved at deklarere den i det geometriske objekt. Princippet er, at en geom altid arver aes() fra ggplot(), medmindre andet er specificeret i geom. Nedenfor laves to identiske grafer ved at specificere aes() i henholdsvis ggplot() og geom_point(), som laver et punktdiagram (eng. scatter plot):

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

## aes() specificeres i geom_point()
ggplot(data=mpg) +
  geom_point(aes(x = displ, y = hwy))
Punktdiagram af motorvolumen (displ) mod brændstofforbrug (hwy) i datasættet mpg
Punktdiagram af motorvolumen (displ) mod brændstofforbrug (hwy) i datasættet mpg

Geometriske objekter defineres i lag

Du kan visualisere flere geometriske objekter i én graf ved at deklarere dem sekventielt. Når et geometrisk objekt er deklareret, skal det afsluttes med +, og der skal laves et linjeskift for at fortsætte med at deklarere objekter eller indstillinger. Nedenfor bruges data fra mpg til at visualisere sammenhængen mellem motorens volumen (displ) og brændstofforbrug (hwy) med to forskellige geometriske objekter. Det første objekt er geom_point(), som laver et punktdiagram for datapunkterne. Det andet objekt er geom_smooth(), som automatisk beregner en fleksibel regressionslinje for datapunkterne; denne fanger lineære og ikke-lineære mønstre i data.

ggplot(data = mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  geom_smooth()
Punktdiagram af displ mod hwy med fleksibel blå regressionslinje og gråt konfidensbånd fra geom_smooth

Bemærk, at hvert geometrisk objekt arvede æstetisk mapping (aes()) fra ggplot(). Bemærk også, at punkterne ligger under regressionslinjen (blå linje), hvilket skyldes, at geom_point() blev deklareret først i koden ovenfor.

Alle geometriske funktioner har et aes()-argument, hvilket betyder, at den æstetiske mapping i stedet kan deklareres i det geometriske objekt. Nedenstående kode resulterer i en tilsvarende graf som ovenstående, 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))
Punktdiagram af displ mod hwy med fleksibel blå regressionslinje og gråt konfidensbånd fra geom_smooth

En æstetisk mapping kommer til udtryk på forskellige måder i forskellige geoms. Det illustreres nedenfor ved at mappe variablen class (køretøjstype) til argumentet color i aes(). For geom_point() vil dette resultere i, at datapunkterne farvekodes efter køretøjstype. For geom_smooth() vil det betyde, at der beregnes separate regressionslinjer, som farvekodes (med de samme farver):

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth()
Punktdiagram af displ mod hwy farvekodet efter køretøjstype (class) med en fleksibel regressionslinje per køretøjstype

Vi kan ignorere aes() i ggplot() (linje 1) og specificere en separat aes() i geom_smooth() (linje 3). Nedenfor gøres dette ved at mappe color til køretøjets drivlinje (drv).

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth(aes(color=drv))
Punktdiagram af displ mod hwy farvekodet efter class, regressionslinjer per drivlinje (drv) i samme farveforklaring

Desværre ser vi, at når både class og drv mappes til color, får vi én (i stedet for to) farveforklaring til højre. Det gør, at farvekoder for drv (4, f, r) præsenteres i samme kolonne som farvekoder for class (2seater, compact, midsize, etc). Dette kan skabe tvetydighed ved fortolkningen af grafen. For at undgå dette skal vi mappe drv til et andet argument i aes(). I dette tilfælde kan vi mappe drv til linetype, som er linjetype. Så får hvert niveau i drv sin egen linjetype. Bemærk også, at vi specificerer se=FALSE for at fjerne konfidensintervallet for linjerne samt method="lm", som viser en lineær regressionslinje i stedet for en fleksibel linje (disse tilføjelser laves, for at grafen bliver tydeligere):

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth(aes(linetype=drv), se=FALSE, method="lm")
Punktdiagram af displ mod hwy farvekodet efter class med lineære regressionslinjer, hvor linjetypen angiver drivlinje (drv)

Det lykkedes! Kan du se, om sammenhængen mellem displ og hwy varierer med forskellige kombinationer af suv og drv?

Et geometrisk objekt kan bruge en undergruppe af datasættet. Lad os lave ovenstående graf om og kun vise regressionslinjen for biler af klassen pickup:

ggplot(data = mpg, aes(x = displ,
                       y = hwy,
                       color=class)) +
  geom_point() +
  geom_smooth(data=filter(mpg, class=="pickup"))
Punktdiagram af displ mod hwy farvekodet efter class med fleksibel regressionslinje kun for pickup-biler

På samme måde kan vi oprette et geometrisk objekt for at fremhæve en del af data. Vi gør nu følgende:

  1. Linje 8: Tilføj en geom_point() kun med pickup-biler, med sorte punkter i størrelse 4,5.

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

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

ggplot(data = mpg, aes(x = displ,
                       y = hwy,
                       color=class)) +
  # Alle datapunkter
  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"))
Punktdiagram af displ mod hwy, hvor pickup-biler fremhæves med større punkter med sort kant og egen regressionslinje

Formålet med dette er at fokusere grafen på pickup-biler. Punkter med størrelse 2,5 deklareres efter punkter med størrelse 4,5, så de mindre punkter havner oven på de store. Objektet geom_smooth() deklareres allersidst og havner derfor forrest i grafen.