R allgemein: - konsolenbasiert, unter Windows mit RGui, für Linux und Mac z.B. RStudio - Sprache (basierend auf) S - interpretierte Sprache, d. h. interaktiv oder mit Skripten benutzbar (kein Compiler) - Basisfunktionalität, Erweiterung durch Laden/Nachinstallieren von Bibliotheken (Packages) - Packages: können Funktionen, Daten, Hilfeseiten bereitstellen, müssen für die Verwendung explizit geladen werden - Workspace: alle Objekte/Funktionen etc. in "RData"-Datei speicherbar Verwendung der Hilfe und von Beispielen: - Hilfe allgemein bzw. für ein Kommando: help.start(), help(befehl) / ?befehl - Befehle, die "befehl" enthalten: apropos("befehl") - Beispiele / Demos: example(befehl), demo(), demo(graphics) Plots für Vektoren/Matrizen/Data Frames: - Plotten von Vektoren (als y-Werte, x: die jeweilige Position im Vektor) x <- runif(100) x print(x) summary(x) plot(x) - Sinusfunktion ausgewertet für alle Stellen aus einem Vektor, mit Plot: x <- sin(1:100) plot(x) plot(x, type="l") # optionale Parameter werden mit Namen angegeben, hier Darstellungstyp Linie ?plot ?plot.default # Anmerkung: es gibt verschiedene Plot-Methoden, "plot" verwendet automatisch die zum Objekt passende, vorhandene: methods(plot) - Plotten von x-Vektor und dazugehörigem y-Vektor (hier quadrierte x-Werte): x <- c(1,2,3,4,5,6,7,8,9,10) x <- seq(1,10) # gleich wie 1:10 oder der Vektor mit c() oben x y <- x^2 # arbeitet elementweise y plot(x, y, type="l") - Matrix konstruieren: m <- cbind(x,y) # Spalten verbinden (column bind), es gibt auch rbind (row bind) m plot(m, type="l") - einzelne Spalten aus Matrix: plot(m[,"x"], m[,"y"], type="l") - nur bestimmte Zeilen aus Matrix: m[ m[,"x"]>5 , ] - Data Frame (flexiblere Datenhaltung als z.B. mit Matrizen möglich): d <- data.frame(m) d d <- data.frame(x,y) d plot(d, type="l") # Hinweis: einzelne Spalten aus Data Frame: d$x bzw. d$y - Notiz: Speichern/Laden von Daten: write.table(d, file="/Pfad/zur/Tabelle.txt") daten <- read.table("/Pfad/zur/Tabelle.txt", header=TRUE) Plot einer (empirischen) Verteilungsfunktion: - Gleichverteilung: empirische Verteilungsfunktion (von 100 Realisierungen) plotten n <- 100 x <- runif(n) xsort <- sort(x) i <- (1:n) y <- i/n plot(xsort, y) # echte Verteilungsfunktion hinzufügen (Gerade mit Steigung 1, durch Punkt (0,0)): # abline ist eine "Low Level"-Grafikfunktion und fügt eine Gerade zur bestehenden Grafik hinzu abline(0, 1) - oder das gleiche kürzer: x <- runif(100) plot(sort(x), 1:length(x)/length(x)) abline(0, 1) - schönere Grafik mit Beschriftungen (beachte: expression und paste): x <- runif(100) plot(sort(x), (1:length(x))/length(x), xlab = "x", ylab = expression(F[n]), main = paste("Empirische Verteilungsfunktion\n (X gleichverteilt,", length(x), "Realisierungen)") ) abline(0, 1) - Natürlich gibt es in R dafür auch spezielle Funktionen: plot(ecdf(runif(100))) # "Empirical CDF"-Objekt, R verwendet automatisch "plot.ecdf" zum Zeichnen, das wiederum laut Hilfe "plot.stepfun" für Step Functions) ?plot.ecdf plot(ecdf(runif(100)), col="red", pch="[") # alle vorhandene Farben: colors() - Empirische und tatsächliche Verteilungsfunktion für Normalverteilung: plot(ecdf(rnorm(100)), col="red") curve(pnorm, -2, 2, add=T) # curve für Plot von Funktionen, add=T: plottet die Funktion in die bestehende Grafik Plots von Funktionen: - curve gegenüber plot zu empfehlen, Beispiel: circlearea <- function(r) r^2 * pi plot(circlearea, type="o") plot(function(x) circlearea(x), type="o") # aber: plot(circlearea(x), type="o") funktioniert nicht # besser curve verwenden, speziell wenn "add=T" gebraucht wird: curve(circlearea) curve(circlearea, 0, 100) curve(circlearea, xlim=c(0, 100)) # das gleiche wie in der Zeile davor - Also: Wesentlicher Unterschied curve/plot: erster Parameter von curve wird immer als Funktion interpretiert, bei plot nicht: plot(function(x) dnorm(x, mean = 2, sd = 3), -8, 12, col = "red") # function(x)-Konstruktion notwendig, damit es funktioniert curve(dnorm(x, mean = 2, sd = 3), -8, 12, col = "red") Plots von komplizierteren eigenen Funktionen: - Vektor als Parameter für eigene Funktionen sollte unterstützt sein, Beispiel: # einfache Implementierung für Gauss-Klammer (findet die größte ganze Zahl, die kleiner gleich x ist) gauss <- function(x) { k <- 0 while (k <= x) { k <- k + 1 } return (k - 1) } curve(gauss, 0, 5.5) # funktioniert nicht # Fehler! Die Funktion gauss(x) kann keine Vektoren verarbeiten. # Gauss-Klammer die mit Vektoren zurechtkommt: gauss2 <- function(x) { # Rückgabewert soll ein Vektor mit der gleichen Länge wie x sein k <- rep(0, length(x)) # Schleife über alle Elemente von x for (i in 1:length(x)) { while (k[i] <= x[i]) { # überall den Index i hinzufügen k[i] <- k[i] + 1 } } # den Vektor k - 1 zurückgeben return (k - 1) } curve(gauss2, 0, 5.5) - Histogramm: x <- runif(1000) hist(x) ?hist hist(x, breaks=20) # 20 Klassen hist(x, breaks=c(0, 0.5, 1)) # 2 Klassen mit gegebener Einteilung - empirische Dichte (über Kerndichteschätzung): plot(density(x)) ?density - Histogramm und empirische Dichte in eine Grafik zeichnen: hist(x, freq=F) # absolute Häufigkeiten deaktivieren plot(density(x), add=T) # funktioniert nicht, add=T hier nicht unterstützt, deshalb: lines(density(x)) # lines verbindet die Punkte, die bei der empirischen Dichte geschätzt wurden - QQ-Plot zum Vergleich von Verteilungen: x<-runif(100) y<-runif(100) qqplot(x,y) # Quantile gegeneinander gezeichnet liegen auf einer Geraden y<-rnorm(100) qqplot(x,y) # unterschiedliche Verteilung: nicht auf einer Geraden - Balkendiagramm mit horizontaler Linie auf Höhe des Mittelwerts: y <- c(4, 6, 5, 7, 6) barplot(y) abline(h = mean(y), col = "blue", lwd = 3) - Boxplot: x1 <- c(rnorm(100, 0, 1), 4) x2 <- c(rnorm(100, 2, 1), -1) x3 <- c(rnorm(100, 1, 1), 5) x <- data.frame(x1, x2, x3) boxplot(x) - Am Beispiel von Boxplots - Grafiken nebeneinander: oldpar <- par(mfrow = c(1, 4)) # mit par kann man die Grafikausgabe anpassen, hier 4 Spalten nebeneinander (1 Zeile) boxplot(runif(100), main = "uniform") boxplot(rnorm(100), main = "normal") boxplot(exp(rnorm(100)), main = "lognormal") boxplot(rcauchy(100), main = "cauchy") par(oldpar) # alte Parameter der Grafikausgabe wiederherstellen, d.h. nur eine Spalte - Weitere Low-Level Plot-Funktionen: plot(1:10, xlab = "xlab", ylab = "ylab", main = "main", sub = "sub") # verschiedene Beschriftungen mtext("mtext 1", side = 1, col = "blue") mtext("mtext 2", side = 2, col = "blue") mtext("mtext 3", side = 3, col = "blue") mtext("mtext 4", side = 4, col = "blue") legend("right", legend = c("lty 1", "lty 2", "lty 3", "lty 4"), lty = 1:4, title = "line types") # Beispiel-Legende Grafiken speichern: - Angezeigte Grafik speichern: dev.copy(png,'plot.png') dev.off() - Grafikausgabe direkt umlenken: png('plot.png') plot(dnorm) dev.off()