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
<- ex_survey # Eksempeldata, bytt ut med ditt eget mine_data
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.
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 |> # Bytt ut med eget datasett
mine_data 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() |>
::copy_labels_from(mine_data) |> # Må kopiere tilbake variabeletiketter som forsvinner når man bruker mutate
labelledmakeme(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_")) |>
::pivot_longer(cols=matches("c_"),
tidyrnames_to = "variable") |>
left_join(y=labelled::look_for(mine_data,
"c_", details=F),
by="variable") |>
::separate(col = label,
tidyrsep = " - ",
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)) |>
::ggplot(mapping=ggplot2::aes(x=suffix,
ggplot2y=value,
tooltip=tooltip,
fill = suffix)) + # NB, herfra benyttes `+`
::geom_boxplot_interactive() +
ggiraph::scale_fill_manual_interactive(name="",
ggiraphvalues=nifutheme::nifu_cols()[c(1,5)],
data_id = function(x) x,
tooltip = function(x) x) +
::guides(fill=ggiraph::guide_legend_interactive(position="bottom", direction="horizontal")) +
ggplot2::theme_classic() +
ggplot2::theme(axis.title.x = ggiraph::element_text_interactive(hjust = .5),
ggplot2legend.position="bottom", legend.location = ) +
::coord_flip() +
ggplot2::labs(x=NULL, y="Years experience")
ggplot2
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.
<- qs::qread("min_figur.Rds")
min_figur # 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 ::update_variable_labels_with(.cols = b_1, .fn = ~stringr::str_replace_all(.x, "Bejing", "Beijing")) |>
labelledmakeme(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:
::wrap_plots(Old = makeme(mine_data, dep=a_1:a_9),
patchworkNew = 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
mitt_plot_v2 $data <-
mitt_plot_v2$data |>
mitt_plot_v2mutate(.variable_label =
::fct_relevel(.variable_label,
forcats"Bejing",
"Budapest",
"Brussels"))
# Dette er bare for å vise før og etter i samme plot:
::wrap_plots(Old=mitt_plot,
patchworkNew=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())))