Grunnleggende figurer

Alle utkast har forbedringspotensiale

Saros gir kun utkast. Ved nøye justerte innstillinger slipper man å endre på så mye, men kan ta tid å komme til det stadiet. Dessuten, variasjon og tilpasning er viktig. Antar for alle påfølgende eksempler at du har lastet inn `{tidyverse}`-pakken, samt et (kapittel)-datasett.

suppressPackageStartupMessages(library(tidyverse, warn.conflicts = FALSE, quietly = TRUE))
library(saros, warn.conflicts=FALSE, quietly = TRUE) # gir deg makeme og girafe-funksjonene
source(fs::path(Sys.getenv("USERPROFILE"), "NIFU", "Metode - General", 
                "SAROS-core", "shared resources", 
                "nifu_global_general_formatting.R")) # Ligger allerede øverst i forhåndsgenererte qmd-filer
mine_data <- ex_survey # Eksempeldata, bytt ut med ditt eget

Lage vanlige stolpediagrammer for ordinale (matrise)spørsmål

mitt_plot <-   
  mine_data |>   
  makeme(dep = b_1:b_3) # Ev. også indep = x1_sex 
girafe(ggobj = mitt_plot)

Lage stolpediagram for (matrise)spørsmål der det er avkrysningsbokser (Valgt/Ikke valgt)

Man kan om ønskelig omkode slike sett med variabler slik at der ingen har valgt noen av alternativene så anses hele settet som missing (respondenten har oversett/ignorert spørsmålene), og i andre tilfelles betyr Ikke valgt at man aktivt har unlatt å krysse av. (Tvetydigheten gjør at slike spørsmål bør man derfor være noe nølende med å benytte).

I tillegg vil `nifu_global_general_formatting.R` gjøre at Ikke-valgt kategorien farges hvit og legges på høyre side.

mitt_plot2 <-  
  mine_data |> # Bytt ut med eget datasett   
  rowwise() |>  # Omkode Ikke valgt til missing dersom ikke valgt noen av variablene i settet
  mutate(a_99 = sum(as.integer(c_across(matches("a_[1-9]$")))-1),
         across(matches("a_[1-9]$"), 
                ~factor(ifelse(a_99==0,
                               NA_character_,
                               as.integer(.x)), 
                        levels=1:2,
                        labels = c("Ikke valgt", "Valgt"))),
        a_99 = NULL) |>
  ungroup() |>
  labelled::copy_labels_from(mine_data) |> # Må kopiere tilbake variabeletiketter som forsvinner når man bruker mutate
  makeme(dep=matches("^a_[1-9]$")) # Velger ut alle variabler som begynner på a_ og så kommer et siffer før slutten
girafe(ggobj = mitt_plot2)

Lage boxplot-figur for (matrise)spørsmål med kontinuerlige data

Dette vil i fremtiden genereres automatisk av saros.

mitt_plot3 <-   
  mine_data |>
  select(matches("c_")) |>
  tidyr::pivot_longer(cols=matches("c_"), 
                      names_to = "variable") |>
  left_join(y=labelled::look_for(mine_data, 
                                 "c_", details=F), 
            by="variable") |> 
  tidyr::separate(col = label,                    
                  sep = " - ",                   
                  into = c("prefix", "suffix")) |>
  filter(!is.na(suffix)) |>
  mutate(tooltip = paste0("Snitt = ", 
                          round(mean(value, na.rm=TRUE), 1),
                          "\nN = ", 
                          sum(!is.na(value))),
         .by=c(suffix)) |>
  ggplot2::ggplot(mapping=ggplot2::aes(x=suffix, 
                                       y=value, 
                                       tooltip=tooltip,
                                       fill = suffix)) + # NB, herfra benyttes `+`
  ggiraph::geom_boxplot_interactive() + 
  ggiraph::scale_fill_manual_interactive(name="",
                                         values=nifutheme::nifu_cols()[c(1,5)],
        data_id = function(x) x,
        tooltip = function(x) x) +
  ggplot2::guides(fill=ggiraph::guide_legend_interactive(position="bottom", direction="horizontal")) +
  ggplot2::theme_classic() + 
  ggplot2::theme(axis.title.x = ggiraph::element_text_interactive(hjust = .5),
                legend.position="bottom", legend.location = ) + 
  ggplot2::coord_flip() + 
  ggplot2::labs(x=NULL, y="Years experience")

girafe(ggobj = mitt_plot3)

Redigere figurer (fra ggplot2/ggiraph)

For de følgende operasjonene antar vi at figuren heter min_figur, og at alle operasjonene settes inn mellom der du leser inn figuren, og der du viser den frem (siste linjen i chunken). Viser i eksemplene nedenfor kun det som skal settes inn. Som du ser er det egentlig bare vanlige filter, mutate, osv, operasjoner du kjenner fra tidyverse. Forskjellen er at vi gjør endringer på datasettet inni figur-objektet.

min_figur <- qs::qread("min_figur.Rds")
# sett inn etter du har lest inn eksisterende figur, og før du ber ggiraph om å lage den for deg
girafe(ggobj = min_figur)

Endre akse-etiketter (dvs. en variabeletikett) i en figur

ex_survey1-datasettet har en skrivefeil, har du oppdaget den?

mitt_plot_korrigert <-
    mine_data |>
    labelled::update_variable_labels_with(.cols = b_1, .fn = ~stringr::str_replace_all(.x, "Bejing", "Beijing")) |>
    makeme(dep=b_1:b_3)
girafe(ggobj = mitt_plot_korrigert)

Reversere vertikalt (snu variablene opp-ned)

Merk at det er x-aksen man reverserer, fordi figuren allerede er snudd om (x=>y, y=>x). Merk at man bruker + symbolet om du slår sammen figurkomponenter, mens det er |> når du piper et datasett.

# wrap_plots er bare for å vise før og etter i samme plot:
patchwork::wrap_plots(Old = makeme(mine_data, dep=a_1:a_9),
                      New = makeme(mine_data, dep=a_1:a_9, descend=FALSE),
                      ncol = 2) |>
  girafe()

Skreddersydd sortering av variablene i figuren

Alle som har jobbet litt med ggplot2 vet at det ikke bare er å sortere datasettet man sender til ggplot() - den tar alltid utgangspunkt i factor levels for variabelen (og er det ikke en factor så omgjøres den til det). Trikset er å stille inn rekkefølgen på factor levels manuelt. forcats-pakken har også mange andre funksjoner for å jobbe med factor-variabler!

mitt_plot_v2 <- mitt_plot
mitt_plot_v2$data <-
  mitt_plot_v2$data |>
  mutate(.variable_label = 
           forcats::fct_relevel(.variable_label,
                                "Bejing",
                                "Budapest",
                                "Brussels"))

# Dette er bare for å vise før og etter i samme plot:
patchwork::wrap_plots(Old=mitt_plot,
                      New=mitt_plot_v2, 
                      ncol=2) |>
  girafe()

Endre høyden på figuren

Flere tilnærminger:

  • Prøve seg frem med chunk option: #| fig-height: 1.5
girafe(mitt_plot)
  • La støttefunksjonen fig_height_h_barchart() gjette riktig høyde ut fra antall variabler, tekstlengde, osv. Nyttig når det er forhåndsgenerert.

    #| fig-height: !expr saros::fig_height_h_barchart(n_y = 3, n_cats_y = 5, max_chars_labels_y = 82, max_chars_cats_y = 15)

girafe(mitt_plot)
  • Modifisere støttefunksjonen fig_height_h_barchart() med noen små justeringer (multiplier_per_plot)

    #| fig-height: !expr saros::fig_height_h_barchart(n_y = 3, n_cats_y = 5, max_chars_labels_y = 82, max_chars_cats_y = 15, multiplier_per_plot = .75)

girafe(mitt_plot)
  • Om du har først kjørt og bevart figuren (f.eks. min_figur1 finnes i minnet) kan du bruke fig_height_h_barchart2(min_figur1) *i konsollen* for å få tallet du setter for #| fig-height: <tallet>. (Det går ikke å sette {r, fig.height = saros::fig_height_h_barchart2(min_figur1)} direkte)

Merk at høydejusteringen per nå ikke er synlig når chunken kjøres i RStudio, først synlig etter rendring. Bredde skal du “aldri” justere, det går automatisk.

Juster linjeskift i variabeltekst i bivariate stolpediagrammer

Problemer med at noe tekst kuttes av helt til venstre? Sett først makshøyde ovenfor. Så dette, og eventuelt juster

mitt_plot3 <-   
  mine_data |>   
      makeme(dep = p_1:p_3, indep = x1_sex, label_separator=NULL, strip_width=60)
girafe(ggobj = mitt_plot3)

Juster figurforklaringen i figuren

Med mange svarkategorier, som har lang tekst, så kan det være at siste kategorien kuttes. Det gjelder særlig for docx-versjonen. Prøv følgende:

mitt_plot_e4 <-
  makeme(mine_data, dep=e_1:e_4) 
  # ggplot2::guides(fill = ggiraph::guide_legend_interactive(nrow=3,
  #                                                          byrow=TRUE,
  #                                                          title = NULL)) + # sett nrow=2 dersom du har mange kategorier
  # ggplot2::theme(legend.location = "plot")
    girafe(ggobj = mitt_plot_e4, ncol=2)

Endre fargeskala: NIFUs automatiske palett

Ved å laste inn nifu_global_general_formatting.R så får man NIFUs fargepalett. Denne fargelegger skalaene ut i fra en rekke regler og sedvaner etablert i ulike prosjekter. Denne kan enkelt overstyres for hele dokumentet eller per figur. Merk at dette gjøres i girafe(). Dette er for at man står mer fleksibelt til å legge inn regler for fargelegging etter at selve figuren er laget og muliggjør alskens tilpasninger av ggplot-objektet etter at makeme() har laget det.

mitt_plot_blue <-    
  makeme(data=mine_data, dep=p_1:p_4)
girafe(ggobj = mitt_plot_blue, palette_codes = list(nifutheme::nifu_cols()))

Snu fargeskala

mitt_plot_blue <-    
  makeme(data=mine_data, dep=p_1:p_4)
girafe(ggobj = mitt_plot_blue, palette_codes = list(rev(nifutheme::nifu_cols())))

Gjenbruk