Den meget korte introduktion til at plotte i R og ggplot2

Generelt

ChatGPT er verdensmester i at lave grafer i R. Indsæt lidt af dine data, og forklar hvad du gerne vil have.

Tilføj altid følgende til din forespørgsel: Brug ggplot/tidyverse. Brug mine kolonnenavne og kald dataframen for “data”. ChatGPT kan også forklare dig, hvad der foregår i nedenstående eksempler.

Vigtigt

Fejlmeddelser fra denne side kan være svære at forstå - hvis du sætter et komma forkert, eller glemmer en parantes. Men indsæt blot din kode i ChatGPT, så fortæller den dig hvad der er galt

Den meget korte forklaring

Hvis du vil forstå nedenstående kode, så er der ingen vej uden at læse noget om R/ggplot (eller spørge en AI). Men dette kan være godt at vide i første omgang:

  • De data du indsætter i datavinduet er tilgængelige i en såkaldt dataframe med navnet ‘data’. Alle kolonner indlæses som tal eller tekst, så hvis du f.eks. har brug at en kolonne opfattes som en dato eller en kategori, så skal du selv omdanne den i din R-kode.
  • %>% er en såkaldt pipe-operator. Den tager det der står på venstre side, og sender videre til kommandoen på højre side. Dermed kan du lave meget lange og komplekse operationer, som læses naturligt - en linje ad gangen.
  • Linjer der starter med # er kommentarer, som bliver ignoreret af R

Dotplot

Hvis du har indsat data med kolonnen ‘P-HbA1c’, så laves dotplot således:

(Bemærk det er nødvendigt med ` ` rundt om P-HbA1c fordi R ellers fortolker bindestregen som et minus, og ikke en del af kolonnenavnet)

data %>%
    ggplot() +
    geom_dotplot(mapping = aes(y = `P-HbA1c`, x = ""), binaxis = "y", stackdir = "center")

Hvis du vil gruppere plottet efter værdien i kolonnen “Kontrol_id”, så gør således:

data %>%
    # omdan kontrol_id til en katogorial-variabel
    # (nødvendigt fordi vi har brugt et tal som gruppe-værdi)
    mutate(Kontrol_id = as.factor(Kontrol_id)) %>%
    ggplot() +
    geom_dotplot(
        mapping = aes(y = `P-HbA1c`, x = Kontrol_id),
        binaxis = "y",
        stackdir = "center"
    )

Middelværdi og konfidensinterval

Hvis du har indsat data med kolonnen “P-HbA1c”, og ønsker at lave et plot med illustration af middelværdien og tilhørende konfidensinterval, så kan det gøres som vist herunder (der er mange alternativer).

Først beregnes middelværdi og konfidensinterval. Dernæst plottes de.

data %>%
    ggplot() +
    stat_summary(
        mapping = aes(x = "", y = `P-HbA1c`),
        fun.data = mean_cl_normal,
        geom = "pointrange",
        color = "red",
        linewidth = 0.5,
        size = 1
    ) +
    labs(x = "", y = "P-HbA1c, stofk (mmol/mol)") +
    theme(text = element_text(size = 15))

Opdeling

Og det kan selvfølgelig opdeles efter Kontrol_id på samme måde:

data %>%
    mutate(Kontrol_id = as.factor(Kontrol_id)) %>%
    ggplot() +
    stat_summary(
        mapping = aes(x = Kontrol_id, y = `P-HbA1c`, color = Kontrol_id),
        fun.data = mean_cl_normal, geom = "pointrange", ,
        linewidth = 0.5, size = 1
    ) +
    labs(x = "", y = "P-HbA1c, stofk (mmol/mol)") +
    theme(text = element_text(size = 15))

Transformation af data

Nogle gange har man data i et bredt format, som f.eks. her:

Tabel 1: Tabel i bredt format

Dansk	Tysk
171	185
175	166
179	187
165	177
190	182
182	185

Hvis disse data skal benyttes effektivt i ggplot, så skal de omdannes til et langt format, dvs. således:

Tabel 2: Tabel i langt format

Land 	 Højde (cm) 
Dansk	171
Tysk	185
Dansk	175
Tysk	166
Dansk	179
Tysk	187
Dansk	165
Tysk	177
Dansk	190
Tysk	182
Dansk	182
Tysk	185

Dette kan gøres med følgende kode (som efterfølgende laver et dotplot).

Hvis du vil køre nedenstående kode, skal du først kopiere data fra Tabel 1

# Her foretages omdannelsen. Gem dine omdannede data i en ny variabel 'data_long', for så kan du se dem
# i fanen "genererede data".
data_long <- data %>%
    # omdan til langt format
    pivot_longer(
        cols = everything(),
        names_to = "Land",
        values_to = "Højde (cm)"
    )
# plot dine omdannede data
data_long %>%
    ggplot() +
    geom_dotplot(
        mapping = aes(y = `Højde (cm)`, x = Land),
        binaxis = "y",
        stackdir = "center"
    )