Charlie Lindgren, Doktorand i Mikrodata Analys
5 april 2017
Säg att vi har en vektor
x <- c(1,2,3,1,7,5)
och vill plotta denna (lite svenska och engelska blandat här), alltså skapa en graf över den. Då använder vi helt enkelt funktionen plot() i R.
?plot
Det här är okej för en snabb titt på vår vektor, men vi vill gärna snygga till det lite. Vi lägger till etiketter på axlarna och plottar en linje istället. Vi lägger också till en titel på plotten.
plot(x, xlab = "x-värde", ylab = "y-värde", main = "En enkel plot", type = "l") # "l" står för line.
Läser ni i hjälpdokumentationen så finns fler sätt att visa samma data på olika sätt.
# "p" for points, (default)
# "l" for lines,
# "b" for both,
# "c" for the lines part alone of "b",
# "o" for both ‘overplotted’,
# "h" for ‘histogram’ like (or ‘high-density’) vertical lines,
# "s" for stair steps,
# "S" for other steps, see ‘Details’ below,
# "n" for no plotting.
plot(x, xlab = "x-värde", ylab = "y-värde", main = "En enkel histogram plot", type = "h")
Jag vill att ni öppnar text filen dollar.txt som jag har gjort tillgänglig på fronter. Använd koden nedan men modifiera sökvägen. Det är irriterande men Windows kör med bakvänt backslash tecken så man måste vända detta manuellt för att det skall funka i R.
d = read.table("C:/Users/clg/Dropbox/~ Teaching ~/VT 17 MA1041 Mathematics for Civil Planning and Construction/R introduktion/Teaching-R-Swedish/R plots/dollar.txt", col.names=c("month","year", "index"))
Med fler val plot argument kan man få till snyggare grafer med mer meningsfulla åskådligöringar. Exemplet nedan gäller för dollarns index sedan 1973, kopiera denna till ett script. (källa)
plot(d$index, axes=F, ylim=c(0,150), typ='l', ann=F)
par(tcl= -0.2)
axis(1, at=seq(1, 445, by=12), labels=F, lwd=1, lwd.ticks=1)
par(tcl= -0.5)
axis(1, at=seq(1 + 12*2, 450, by=60), labels=seq(1975,2010,5), lwd=0, lwd.ticks=2)
par(tcl= -0.5)
axis(2)
abline(v=(12*(seq(2,32,by=5)))+1, col="lightgray", lty="dotted")
abline(h=(seq(0,150,25)), col="lightgray", lty="dotted")
title(main="Nominal Major Currencies Dollar Index", sub="Mar 1973 = 100.00", ylab="US$ vs major currencies")
linear.model = lm(d$index ~ row(d)[,1])
abline(linear.model, col="blue")
En behändig och i många underskattad funktion i R är curve().
?curve
Funktionen låter er plotta matematiska formler, det vill säga plotta funktioner.
Kurvfunktionen tar, som första argument, ett uttryck i R. Uttrycket bör vara en matematisk funktion i form av x.
Vi kan också lägga till en kurva ovanpå den gamla med “add = TRUE”. semikolon tecknet betyder ny rad för koden.
curve((x)); curve(x^2, add = TRUE)
Vi kan även lägga till punkter och text precis som i vanliga plot.
curve(x^2, type="p", ylab = "y-axeln", xlab = "x-axeln", main = "Plot med punkter")
Vi kan också plotta mellan två eget angivna värden med from och to, och dessutom bestämma hur stor del av plotten vi skall titta på oberoende av dessa värden.
curve(x^3, from = -2, to = 2, xlim = c(-5, 5), ylim = c(-9, 9))
curve(x^3, xlim = c(-5, 5), ylim = c(-9, 9))
Vill vi även lägga till linjer för var x-axeln skär y-axeln. Detta kan vi enkelt göra med
abline(v=0, h=0)
efter vi har skapat vår plot. Vi vill kanske även få denna linje lite mer distinkt från själva plotten, då ändrar vi linjetyp.
abline(v=0, h=0, lty = "dashed")
curve(x^3, xlim = c(-5, 5), ylim = c(-9, 9)); abline(v=0, h=0)
curve(x^3, from = -2, to = 2, xlim = c(-5, 5), ylim = c(-9, 9)); abline(v=0, h=0, lty = "dashed")
Slutligen kan vi “go crazy” och trycka in flera kurvor på en gång ☺. Märk här att argumenten lwd för linjebredd och col för kulör har lagts till.
curve((x), from = -2, to = 2, lwd = 2)
curve(0 * x + 1.5, add = TRUE, col = "green")
curve(x^3, add = TRUE, col = "red")
curve(-3 * (x + 2), add = TRUE, col = "orange")
abline(v=0, h=0, lty = "dashed")
På skoj kan ni testa köra följande kod och se vad som händer.
install.packages("plotly")
library(plotly)
plot_ly(z=volcano, type="surface")
ggplot2 är ett populärt paket i R för att plotta generellt och kan ge många imponerande grafer. I vårt fall är vi främst intresserad av funktioner men ni kommer kunna finna stor nytta i att använda detta paket.
install.packages("ggplot2")
library(ggplot2)
?ggplot2
ggplot2 paketet har en extra funktion för att ange funktioner. Så koden kommer skilja sig från plot() men man kan åstakomma mer med detta plot verktyg.
?stat_function
I ggplot2 paketet lägger man till sådana här funktioner genom att addera dom med plustecken till sin orginalgraf.
Vi anger ett tomt dataset att plotta ovanpå. Jag kallar ggplot2 igen från library för presentationen kräver detta, men det behöver inte ni göra i er kod.
library(ggplot2)
p <- ggplot(data = data.frame(x = 0), mapping = aes(x = x))
Nu lägger vi till den funktion vi vill titta på.
library(ggplot2)
vår_funktion <- function(x) x^3
p + stat_function(fun = vår_funktion)
grafen anpassar axlarna till lämplig höjd och bredd för funktionen.
Vi kan även bestämma vilken spann som funktion ska visas på.
library(ggplot2)
vår_funktion <- function(x) x^3
p + stat_function(fun = vår_funktion) + xlim(-1,2) + ylim(-1,3)
axlarna har anpassats till våra nya mått.
Vi lägger till en till funktion.
library(ggplot2)
vår_funktion <- function(x) x^3
en_till_funktion <- function(x) x
p + stat_function(fun = vår_funktion) + stat_function(fun = en_till_funktion) + xlim(-1,2) + ylim(-1,3)
Avslutningsvis så kan ni spara er plot som en variabel och använda funktionen ggplotly (notera y på slutet!) för interaktivitet med funktionen.
library(ggplot2)
library(plotly)
vår_funktion <- function(x) x^3
en_till_funktion <- function(x) x
vår_plot <- p + stat_function(fun = vår_funktion) + stat_function(fun = en_till_funktion) + xlim(-1,2) + ylim(-1,3)
ggplotly(vår_plot)
Vi kommer att gå igenom fler funktioner, grafiska tricks och annat i fortsättningen av kursen.