Mål og forberedelser
I denne arbeidsboken skal du lære å lage grafer med funksjoner som ligger i base R. Denne arbeidsboken går igjennom grunnleggende funksjoner og argumenter som gjør at du skal kunne lage grafene du ønsker. Det finnes også flere tilpasninger utover de som beskrives i arbeidsboken, se gjerne i hjelpefilene til funksjonene du bruker for mer informasjon om argumenter eller prøv google de tilpasningene du ønsker å gjøre.
Arbeidsboken Visualisering av data med ggplot
viser hvordan man kan lage tilnærmet like grafer med ggplot
som er tilnærmet like de som lages i denne arbeidsboken. Om man bruker base R eller ggplot2
er mye basert på preferanse, men det er noen tilpasninger som er enklere å gjøre i ggplot2
enn base R, og visaversa.
Mål for arbeidsboken
I denne arbeidsboken skal du lære:
- Å bygge en graf med
base R
- Å lage forskjellige typer grafer avhengig av dataene du vil visualisere.
- Å tilpasse utseendet til grafer.
Ulike typer plott
I base R har man ulike funksjoner for ulike typer plott, men i alle plottene må man spesifisere hvilke variabler eller objekter det er man ønsker å plotte. De viktigste funksjonene for å plotte i base R er:
barplot()
- søyldiagram.hist()
- histogram.boxplot()
- boksplott.plot()
- tetthetsplott og spredningsplott.
Man kan lage mange ulike typer plott med base R. Hvilket plott man burde velge kommer an på variablene du vil undersøke og målenivået deres. F.eks. når man har en kontinuerlig variabel som alder eller internettbruk på x-aksen, er det ikke særlig nyttig å bruke et stolpediagram. Med et stolpediagram vil det være en stolpe for hver unike verdi og for en kontinuerlig variabel vil det være veldig mange stolper.
Søylediagram
Hvis man har en kategorisk variabel, kan man illustrere fordelingen med et søylediagram. Her bruker vi funksjonen barplot()
:
# Bruker barplot() for å få en oversikt over hvor mange som har stemt
barplot(table(df$valg))
Histogram
For en kontinuerlig variabel kan det være mer nyttig med et histogram, som lager stolper for intervaller. Vi bruker funksjonen hist()
for å lage grafen:
# Bruker hist() for å få en oversikt over fordelingen til respondentenes alder
hist(df$alder)
Hvis vi ikke sier noe annet, så velges det automatisk hvor mange stolper er i histogrammet. Vi kan sette hver stolpe til å være ett år bred ved å bruke argumentet breaks
i hist()
:
# Bruker hist() med breaks
hist(df$alder, breaks = seq(from = 15, to = 90, by = 1))
Hvis vi vil se hvordan alder fordeler seg på stemmegivning, kan vi lage et histogram for hvert kategori i den kategoriske variabelen og sette disse i samme graf. For å gjøre dette på en enklere måte bruker vi barplot()
. Her lager vi først en tabell som inneholder variablene vi ønsker å sammenligne i histogrammet med table()
. Så velger vi fargene til kategoriene i den kategoriske variabelen vår med argumentet col
. Til slutt sier vi at vi vil ha kategoriene skal vises innenfor samme søyle med beside=FALSE
.
Merk at ettersom vi ikke bruker hist()
får vi ikke spesifisert antall søyler, så her får vi en søyle for hvert år. Dette er et eksempel på en graf som er enklere å lage med ggplot()
, se Arbeidsbok 3: Visualisering av data med ggplot.
# Bruker barplot med breaks
histogram_var <- table(df$valg, df$alder)
barplot(histogram_var, col=c("blue", "red"), beside=FALSE)
Boksplott
I det forrige plottet, så vi på hvordan alder fordeler seg på stemmegivning. Dette kan vi se nærmere på ved hjelp av et boksplott. Boksplott er nyttig når vi skal se på spredningen i et datasett. Vi kan også bruke boksplott til å se på om spredningen til en kontinuerlig variabel varierer mellom kategoriene til en kategorisk variabel.
Først kan vi lage et boksplott med boxplot()
som viser spredningen til variabelen alder
.
# Bruker boxplot() for å illustrere fordelingen til respondentenes alder
boxplot(df$alder)
Vi kan også spesifisere at vi vil se hvordan spredningen til alder varierer mellom de som har stemt og de som ikke har stemt med følgende syntaks: boxplot(kontinuerlig_variabel~kategorisk_variabel, datasett)
.
# Bruker boxplot() for å illustrere fordelingen til respondentenes alder basert på stemmegivning
boxplot(alder~valg, df)
Tetthetsplott
Tetthetsplott viser distribusjonen til kontinuerlig variabel, og plottet visualiserer sannsynlighetsfordelingen for dataene med en kontinuerlig linje. Her lager vi et tetthetsplot til variabelen alder
ved å bruke density()
for å finne tetthetsfordelingen og for så plotte denne fordelingen med plot()
.
# Bruker density()
tetthet <- density(df$alder)
# Plotter tetthetsplottet med plot()
plot(tetthet)
Inne i parentesen til plottypen kan vi legge til spesifikasjoner om tykkelse på linjen, farge osv. For å kunne tilpasse tetthetsplottet i større grad, plotter vi det med funksjonen polygon
. Her kan vi velge tykkelsen på linjen med lwd
og fargen med border
. For å velge hva slags farge selve figuren skal ha kan vi bruke funksjonen col
. Vi kan også si hvor gjennomsiktig vi vil at plottet skal være med alpha
fra pakken scales
.
# Endrer på tykkelsen og fargen til linjen, fill og alpha, som kan gjøres i plot
plot(tetthet, col = "blue", lwd = 1.5)
# Endrer på fargen til figuren med polygon()
plot(tetthet)
polygon(tetthet, col = "pink", border = "blue", lwd = 4)
# Endrer på hvor gjennomsiktig figuren er med rgb() og alpha
plot(tetthet)
polygon(tetthet, col = c("pink", alpha = 0.3), border = "blue", lwd = 4)
Lag et tetthetsplott for variabelen “alder” hvor du endrer tykkelsen på linjen til 2 og fargen til rød, fargen på figuren til grønn, og gjennomsiktigheten til 0.1.
plot(tetthet)
polygon(tetthet, col = c("pink", alpha = 0.3), border = "blue", lwd = 4)
plot(tetthet)
polygon(tetthet, col = c("red", alpha = 0.1), border = "green", lwd = 2)
Hvis man ønsker å se hvordan tettshetsplottene for de som har stemt og ikke har stemt er hver for seg, kan man bruke argumentet funksjonen par()
. Her sier man hvordan man vil at plottene som man spesifiserer under skal plasseres ved siden av hverandre.
# Finner tetthet for de som har stemt og ikke stemt
tetthet_stemt <- density(df$alder[df$valg == "Stemt"])
tetthet_ikkestemt <- density(df$alder[df$valg == "Ikke stemt"])
# Lager to tetthetsplott og bruker par() for å spesifisere at de skal være i en kolonne
par(mfrow = c(2,1))
plot(tetthet_stemt, col = "blue", lwd = 4) +
plot(tetthet_ikkestemt, col = "pink", lwd = 4)
## integer(0)
Spredningsplott
Med et spredningsplott kan vi vise sammenhengen mellom to kontinuerlige variabler. Her må vi gi funksjonen plot()
informasjon om hvilke variabler som skal være på x- og y-aksen. Her lager vi et plott med alder
på x-aksen og internett
på y-aksen.
# Bruker plot()
plot(x = df$alder, y = df$internett)
Vi kan videre legge til en linje som viser gjennomsnittet i observasjonene med geom_smooth
.
gjennomsnitts_linje <- loess(alder ~ internett, data=df, span = 0.5)
linje <- predict(gjennomsnitts_linje)
plot(x = df$alder, y = df$internett)
lines(linje, x = df$alder, col = "blue")
Dersom vi ønsker å skille observasjonene for de som har stemt og de som ikke har stemt fra hverandre kan vi gjøre dette ved å legge til argumentet col
. col
står får colour og da vil punktene for de som har stemt og de som ikke har stemt få hver sin farge.
# Legger til farger med col
plot(x = df$alder, y = df$internett, col = df$valg)
Lagring av plott
Det siste som gjennomgås i denne arbeidsboken er hvordan man kan lagre plott. Underveis i arbeidet, så kan du lagre plottene dine som objekter i environment:
# Lagrer plottet som et objekt
plott <- ggplot(data = df, aes(x = alder, y = internett)) + geom_point()
Dette gjør at du også kan bygge videre på plottene dine uten å få fryktelig lange koder. Hvis vi vil legge til en tittel til plottet, så kan vi nå bare gjøre slik:
plott + labs(title = "Spredningsplott")
Du kan lagre plottene dine i working directory ved å bruke ggsave
. For å lagre det siste plottet du har kjørt i R, gjør man følgende: bruk ggsave()
-funksjonen, gi plottet et navn, og spesifiser filtypen du vil lagre i.
# png-fil:
ggsave(filename = "Spredningsplott.png")
# pdf-fil:
ggsave(filename = "Spredningsplott.pdf")
Bruk ggsave()
til å skrive koden du ville brukt for å lagre det siste plottet du kjørte i R, gi plottet navnet “Boksplott”, og lagre det som en pdf-fil.
ggsave(filename = "Boksplott.pdf")
Dersom du ønsker å lagre et plott som du har lagret som et objekt i environment, så legger du til argumentet plot =
etterfulgt av det du kalte plottet ditt.
# Lagrer plott med ggsave
ggsave(filename = "Spredningsplott.pdf", plot = plott)
Endre på grafens tittel
Standard tittel: main
For å legge til en enkel tittel på en graf du har laget med kan du legge til argumentet main
.
# Legger til tittel med argumentet main
plot(x = df$alder, y = df$internett, main = "Spredningsplott")
Legg til en tittel på grafen: “Mitt stolpediagram” med main
.
barplot(table(df$valg))
barplot(table(df$valg), main = "Mitt stolpediagram")
Endre på utseendet til grafens tittel
Utseendet til tittelen kan endres med font.main
, cex.main
og col.main
:
font.main
endrer skrifttypen til tittelen med tall, hvor 1=default, 2=fet, 3=kursiv, 4=fet og kursiv (kursiv), “bold” (fet).cex.main
endrer størrelsen til tittelen og man bruker tall til å spesifisere hvor stor man ønsker den skal være.col.main
endrer fargen til tittelen og man skriver navnet til fargen på engelsk, f.eks. “blue”.
# Endrer utseendet til tittelen
plot(x = df$alder, y = df$internett, main = "Spredningsplott", font.main = 2, cex.main = 1.5, col.main = "purple")
Tilpass på utseendet til tittelen. Endre skrifttypen til kursiv, størrelsen til 2 og fargen til “green”.
plot(x = df$alder, y = df$internett, main = "Spredningsplott")
plot(x = df$alder, y = df$internett, main = "Spredningsplott", font.main = 3, cex.main = 2, col.main = "green")
Endre på posisjonen til grafens tittel: plot.title
Vi kan endre på posisjonen til grafens tittel ved å bruke en kombinasjon funksjonene par()
og title()
sammen med funksjonen for den type plitt man ønsker å lage. Syntaksen er som følgende:
par(mar = c(low, left, top, right)) # tall som spesifiserer margene til grafen
title("Grafens tittel",
adj = # flytter tittelen mellom venstre (0) og høyre (1)
line = ) # positive verdier flytter tittelen opp og negative ned
Her ønsker vi å flytte tittelen til venstre og litt nærmere den øverste linjen til grafen.
par(mar = c(3,2,2,1)) # Velger margene
plot(x = df$alder, y = df$internett) # Lager spredningsplott
title("Spredningsplott", adj = 0, line = 0.5) # Legger til og spesifiserer tittel
Legg til tittelen “Mitt plott” med title()
. Flytt til høyre side og under den øvre linjen til grafen.
par(mar = c(3,2,2,1))
plot(x = df$alder, y = df$internett)
par(mar = c(3,2,2,1))
plot(x = df$alder, y = df$internett)
title("Spredningsplott", adj = 1, line = -0.8) # Alle tall fra -0.8 og under flytter tittelen under linjen, her kan man velge litt selv hva man synes ser bra ut
Endre på akser
Man kan lage helt enkle grafer hvor man kun tar med den informasjonen som kreves for å lage grafen. Da vil grafen din få et “default” utseende. I grafen under ser vi spredningsplottet som har blitt spesifisert med plot()
, samt navnene til variablene på x-aksen og y-aksen slik de står i datasettet. Denne grafen gir oss den informasjonen vi trenger, men ofte vil vi tilpasse aksene for å tydeliggjøre hva man ser i grafen.
# Standard spredningsplott uten endringer
plot(df$internett, df$alder)
Tilpass titlene til aksene
Med argumentene xlab
og ylab
kan man endre på tittelen til x-aksen og y-aksen. Dersom man ikke endrer på tittelene vil de automatisk bli satt til navnet på variabelen som tilhører aksen.
# Her har vi endret på tittelen til x-aksen.
plot(df$internett, df$alder, xlab ="Respondentenes internettbruk")
Legg til en tittel på y-aksen med ylab
. Kall aksen “Respondentenes alder”.
plot(df$internett, df$alder, xlab ="Respondentenes internettbruk")
plot(df$internett, df$alder, xlab ="Respondentenes internettbruk", ylab = "Respondentenes alder")
Tilpass utseende til aksetitlene: axis.title()
font.lab
endrer skrifttypen til tittelen med tall, hvor 1=default, 2=fet, 3=kursiv, 4=fet og kursiv (kursiv), “bold” (fet).cex.lab
endrer størrelsen til tittelen og man bruker tall til å spesifisere hvor stor man ønsker den skal være i forhold til tittlene.col.lab
endrer fargen til tittelen og man skriver navnet til fargen på engelsk, f.eks. “blue”.
# Endrer utseendet til aksetitlene med axis.title
plot(df$internett, df$alder, ylab="", xlab = "") # Lager tomme titler for å ikke få dobbelt opp med titler når vi legger til title
title(xlab ="Respondentenes internettbruk", ylab = "Respondentenes alder",cex.lab = 0.75, col.lab = "blue", font.lab = 2)
Tilpass på utseendet til aksetitlene med title()
-funksjonen. i theme()
-funksjonen. Endre col.lab til “green”, cex.lab til 1.1 og font.lab til kursiv.
plot(df$internett, df$alder, ylab="", xlab = "")
title(xlab ="Respondentenes internettbruk", ylab = "Respondentenes alder", cex.lab = 0.75, col.lab = "blue", font.lab = 2)
plot(df$internett, df$alder, ylab="", xlab = "")
title(xlab ="Respondentenes internettbruk", ylab = "Respondentenes alder", cex.lab = 1.1, col.lab = "green", font.lab = 3)
Tilpass utseende til akseetikettene: axis.text()
Man kan enkelt endre på utseendet med funksjonen axis()
.
I funksjonen for plottet:
font
endrer skrifttypen til tittelen med tall, hvor 1=default, 2=fet, 3=kursiv, 4=fet og kursiv (kursiv), “bold” (fet).cex.axis
endrer størrelsen på akseettikettene i forhold til defaultstørrelsen (1).col.axis
endrer fargen til akseettikettene og man skriver navnet til fargen på engelsk, f.eks. “blue”.las
: roterer akseetikettene i forhold til aksene:- 0 = parallelt til aksen (default)
- 1 = horizontalt på aksen
- 2 = vinkelrett på aksen
- 3 = vertikalt på aksen
# Fjerner akseektikettene fra plottet slik at vi kan tilpasse dem med axis()
plot(df$internett, df$alder, xaxt = "n", yaxt = "n")
# Endrer på utseendet til akseetikettene med axis()
axis(1, col.axis = "pink", font = 1, cex.axis = 1.2, las = 2)
axis(2, col.axis = "pink", cex.axis = 1.2, font = 1, las = 2)
Tilpass på utseendet til akseetikkettene med axis(). Sett akseetikkettene vinkelrett på aksene. Endre col.axis til “purple”, cex.axis til 0.8 og font til fet.
# Fjerner akseektikettene fra plottet slik at vi kan tilpasse dem med axis()
plot(df$internett, df$alder, xaxt = "n", yaxt = "n")
# Endrer på utseendet til akseetikettene med axis()
axis(1, col.axis = "pink", font = 1, cex.axis = 1.2, las = 2)
axis(2, col.axis = "pink", cex.axis = 1.2, font = 1, las = 2)
# Fjerner akseektikettene fra plottet slik at vi kan tilpasse dem med axis()
plot(df$internett, df$alder, xaxt = "n", yaxt = "n")
# Endrer på utseendet til akseetikettene med axis()
axis(1, col.axis = "purple", font = 2, cex.axis = 0.8, las = 3)
axis(2, col.axis = "purple", cex.axis = 0.8, font = 2, las = 3)
Tilpass minimums- og maksimumsverdiene på aksene: xlim
og ylim
For å velge hva mininimums- og maksimumsverdiene på aksene skal være kan man bruke argumentene xlim
og ylim
. Her velger vi verdiene vi vil bruke ved å sette dem i c()
.
plot(df$internett, df$alder, xlim = c(0, 2000))
Endre minimumsverdien til -5 og maksimumsverdien til 100 på y-aksen ved hjelp ylim
.
plot(df$internett, df$alder)
plot(df$internett, df$alder, ylim = c(-5, 100))
Bruk av farger
Valg av farger med fill og border
Når man skal velge farger på linjer og fyll på figurene i grafer, kommer hvilke argumenter man bruker an på hvilken type plott man lager.
hist()
(histogram) ogbarplot()
(søylediagram):fill
for fyllet ogborder
for linjen.plot
(spredningsplott):polygon
(tetthetsplott):col
for fyllet ogborder
og linjen.
Man spesifisere fargen ved å skrive: navnet til fargen (på engelsk); rgb-spesifikasjonen (f.eks. #69b3a2); eller NA for å få en gjennomsiktig farge.
# Endrer på fargen til linje med polygon()
plot(tetthet)
polygon(tetthet, col = "lightpink", border = "blue")
Endre fargen til tetthetsplottet til grønn (green) med col
og fargen på linjen til lilla (purple) med border
.
plot(tetthet)
polygon(tetthet)
plot(tetthet)
polygon(tetthet, col = "green", border = "purple")
Gi farger til en variabel
For å vise forskjellen mellom observasjoner med bestemte kategoriske verdier innefor en variabel kan man ogå bruke col
.
# Gir punktene farge basert på nyalder-variabelen med col
plot(df$internett, df$alder, col = df$nyalder)
Gi prikkene til de som har stemt og de som ikke har stemt (valg) forskjellig farge ved hjelp av col
.
plot(df$internett, df$alder)
plot(df$internett, df$alder, col = df$valg)
Endre på tegnforklaring
Standard tegnforklaring
Når man plotter i base R legges det ikke automatisk en tegnforklaring, hvis man legger til en figur-egenskap. Hvis man f.eks. har et spredningsplott hvor prikkene har forskjellige farger basert på en bestemt egenskap, er det nyttig at dette beskrives i grafen. For å legge til tegnforklaring kan man bruke funksjonen legend()
.
I eksempelet under har vi et spredningsplott som viser sammehengen mellom internettbruk og alder. Prikkene (altså hver respondent) er fargelagt basert på om respondenten stemte ved forrige valg eller ikke, som vi viser med en “legend” (tegnforklaring).
Her må vi spesifisere en del elementer for å kunne lage tegnforklaringen. Ettersom vi spesifiserer alt selv, er det viktig å huske på at alt kommer i riktig rekkefølge slik at f.eks. riktig farge og tekst blir matchet. Se også gjerne hjelpefilen til legend (?legend
) for å se alt man kan tilpasse:
- Vi må si hvor vi ønsker å plassere tegnforklaringen. Dette kan man enten gjøre med koordinater eller nøkkelord fra denne listen: “bottomright”, “bottom”, “bottomleft”, “left”, “topleft”, “top”, “topright”, “right” og “center”.
- Vi velger hva slags figurer vi skal ha i legenden. Disse angir vi med argumentet
pch
, og sier hvilken figur med tall mellom 0-25 (se?points
for en oversikt). - For å vise hva fargene viser, spesifisere vi tekst med argumentet
legend
. - For å spesifisere fargene bruker vi
col
og velger hvilken farge hvert element skal ha.
# Lager en tegnforklaring med legend()
plot(df$internett, df$alder, col = df$valg)
legend("topright", legend = c("Stemt", "Ikke stemt"), pch = c(1, 1), col = c("red", "black"))
Endre på koden slik at tegnforklaringen flyttes til det nedre høyre hjørnet i plottet.
plot(df$internett, df$alder, col = df$valg)
legend("topright", legend = c("Stemt", "Ikke stemt"), pch = c(1, 1), col = c("red", "black"))
plot(df$internett, df$alder, col = df$valg)
legend("bottomright", legend = c("Stemt", "Ikke stemt"), pch = c(1, 1), col = c("red", "black"))
Gi prikkene til respondenter som er under og over 50 år (nyalder) forskjellig farge ved hjelp av col
, og legg til tegnforklaring med legend.
plot(df$internett, df$alder)
plot(df$internett, df$alder, col = df$nyalder)
legend("topright", legend = c("Over 50 år", "Under 50 år"), pch = c(1, 1), col = c("red", "black"))
Flere små grafer
I base R kan man bruke funksjonen layout()
til å sette flere grafer sammen. Dette krever to steg:
- At man lager til designet til layouten med funksjonene
matrix()
oglayout()
. - At man lager et multi-panel plott basert på denne layouten med koden for de plottene man ønsker å lage.
Flere grafer: En kategorisk variabel
# Lager designet til layouten
design <- matrix(c(2,2,1,1), 2, 2) # Spesifiserer at vi skal ha to rader og 1 kolonne
layout(design)
par(mar = c(2,2,1,1))
# Lager et multi-panel plott
plot(df$internett[df$valg == "Ikke stemt"], df$alder[df$valg == "Ikke stemt"])
plot(df$internett[df$valg == "Stemt"], df$alder[df$valg == "Stemt"])
Endre på koden under for å lage en graf for respondenter over 50 og en for de under 50 (“nyalder”, hvor 0 = “Under 50 år og 1 =”Over 50 år)“.
# Lager designet til layouten
design <- matrix(c(2,2,1,1), 2, 2) # Spesifiserer at vi skal ha to rader og 1 kolonne
layout(design)
par(mar = c(2,2,1,1))
# Lager et multi-panel plott
plot(df$internett[df$valg == "Ikke stemt"], df$alder[df$valg == "Ikke stemt"])
plot(df$internett[df$valg == "Stemt"], df$alder[df$valg == "Stemt"])
ggplot(df, aes(internett, alder, color = nyalder, shape = valg)) + geom_point() +
facet_wrap(vars(df$nyalder))
Flere grafer: To kategoriske variabler
Med facet_wrap()
kan man bygge flere små grafer ved siden av hverandre basert på verdiene til en kategorisk variabel. Når man bruker facet_wrap()
må man skrive facet_wrap(vars())
, hvor vars()
er funksjon som tolker innputen i konteksten av et datasett.
For å legge til aksetitler, kan man bruke funksjonen mtext()
. Her spesifiserer man hva aksen skal hete, samt hvor den skal plasseres i grafen. Funksjonen tar bl.a. følgennde argumenter (se hjelpefilen for flere argumenter):
text
: Tekst som sier hva aksen skal hete.side
: Spesifiserer hvilken side av grafen teksten skal være på (1 = nederst, 2 = venstre, 3 = øverst, 4 = høyre).line
: På hvilken marg linje teksten skal være på, begynner på 0 og telles utover.outer
: Bruk ytre marger, hvis disse er tilgjengelige (TRUE
/FALSE
).
# Lager designet til layouten
design <- matrix(c(1,2,3,4), 2, 2) # Spesifiserer at vi skal ha to rader og to kolonner
layout(design)
par(mar = c(2,2,2,2))
# Lager et multi-panel plott
plot(df$internett[df$valg == "Ikke stemt" & df$nyalder == 1], df$alder[df$valg == "Ikke stemt"& df$nyalder == 1])
plot(df$internett[df$valg == "Ikke stemt" & df$nyalder == 0], df$alder[df$valg == "Ikke stemt"& df$nyalder == 0])
plot(df$internett[df$valg == "Stemt" & df$nyalder == 1], df$alder[df$valg == "Stemt"& df$nyalder == 1])
plot(df$internett[df$valg == "Stemt" & df$nyalder == 0], df$alder[df$valg == "Stemt"& df$nyalder == 0])
# Legger til aksetitler med mtext()
mtext(text = "Stemmegiving", side = 3, line = - 1.5, outer = TRUE)
mtext(text = "Alder", side = 2, line = - 1.5, outer = TRUE)