SlideShare ist ein Scribd-Unternehmen logo
R base
graphics
Mark Heckmann
University of Bremen, Germany
www.markheckmann.de
Version Januar, 2014
© CC BY-NC 2.0 DE
Zwei Grafiksysteme
(base) graphics
•  Älteres System
•  Sehr schnell
•  Sehr viele
vereinzelte
Funktionen

grid graphics
lattice

ggplot2
Arten von base graphics Funktionen
High-Level functions
Erstellen komplexer
Grafiken, z.B. (hist)

Low-Level functions
Erstellung von Linien,
Punkte, Achsen etc.
oftmals on-top auf
High-Level Funktion
High-Level
Funktionen
High-Level Grafik-Funktionen
plot!

qqnorm!

hist!

boxplot!

barplot!
Don‘t get fooled by default looks: Mit R base graphics
kann man wunderschöne Grafiken produzieren.
Allerdings benötigt dies meist viel Code
!
par(mai=c(0.5,1,0.5,0.5),!
omi=c(0.5,0.5,0.5,0.5),!
family="Lato Light",las=1)!
frauen <- read.csv("daten/frauen.txt",header =F,sep=",")!
for(i in 1:111) !
colnames(frauen)[i]<-paste("x",i+1949,sep="") !
maenner<-read.csv("daten/maenner.txt",header =F,sep=",")!
for(i in 1:111) !
colnames(maenner)[i]<-paste("x",i+1949,sep="")!
rechts<-frauen$x2010!
links<-maenner$x2010!
farbe_rechts<-c(!
rep(rgb(210,210,210,maxColorValue=255),15),!
rep(rgb(144,157,172,maxColorValue=255),50),!
rep(rgb(225,152,105,maxColorValue=255),!
length(rechts)-65))!
farbe_links<-farbe_rechts!
barplot(rechts,axes=F,horiz=T,axis.lty=0,!
border=NA, col=farbe_rechts,xlim=c(-750,750))!
barplot(-links,axes=F,horiz=T,axis.lty=0,border=NA, !
col=farbe_links,xlim=c(-750,750),add=T)!
abline(v=0,lwd=28,col=par("bg"))!
for (i in seq(10,90,by=10)) text(0,i+i*0.2,i,cex=1.1) !
mtext(abs(seq(-600,600,by=200)),!
at=seq(-600,600,by=200), 1,line=-1,cex=0.80)!
rect(-1000,15+15*0.2,1000,66+66*0.2,xpd=T, !
col=rgb(210,210,210,90,maxColorValue=255),!
border=NA)!
mtext("erwerbsfähiges Alter",2,line=1.5,las=3,adj=0.38) !
mtext("Männer",3,line=-5,adj=0.25,cex=1.5,col="grey") !
mtext("Frauen",3,line=-5,adj=0.75,cex=1.5,col="grey") !
mtext("Altersaufb...",3,line=-1.5,adj=0,cex=1.75,!
family="Lato Black",outer=T) !
mtext("Angaben in...",3,line=-3.25,adj=0,cex=1.25,!
font=3,outer=T) !
mtext("Quelle: ww...",1,line=0,adj=1.0,cex=0.95,!
font=3,outer=T)!

Rahlf, T. (2014) Datendesign mit R, S. 222 ff.
Histogramm mit hist!

x <- rnorm(1000)!
hist(x)!
?hist - Argumente von hist!
hist(x, breaks = "Sturges",!
!freq = NULL, probability = !freq,!
!include.lowest = TRUE, right = TRUE,!
!density = NULL, angle = 45, !
! !col = NULL, border = NULL!
! !main = paste("Histogram of" , xname),!
!xlim = range(breaks), ylim = NULL,!
!xlab = xname, ylab,!
!axes = TRUE, plot = TRUE, ! Noch mehr
! !labels = FALSE,!
Argumente.
Mehr dazu
!nclass = NULL, !
später ...
! !warn.unused = TRUE, ...)!
main!

col!
ylab!

ylim!

border!

xlim!

breaks!

xlab!

hist(x, breaks=25, col="grey", main="Histogramm", !
xlab="Werte von x", ylab="Häufigkeit",!
ylim=c(0, 100), xlim=c(-5, 5),!
border="white")!
Your turn! - Erstelle folgendes Histogramm
mit zufälligen Werten mit dem Datensatz
Streudiagramm mit plot!
main!

ylab!

type!

ylim!

xlim!

xlab!
plot(x=IQbio, y=IQfoster, type="p",!
xlab="IQ of twin raised by biological parents",!
ylab="IQ of twin raised by foster parents",!
main="IQ - Zwilling im Vergleich",!
xlim=c(60, 140), ylim=c(60, 140))!
Your turn! - Erstelle folgenden
Plot mit dem iris Datensatz
Einstellung graphischer Parameter
?par

# > 50 Parameter!

bg
cex
col!
las
lwd
pch

Hintergrundfarbe des Plots
Größe des Texts im Plot
Farbe der dargestellten Elemente
Stil der Achsenbeschriftung
Breite von gezeichneten Linien
Art des dargestellte Symbols
Graphical parameters
Über die Funktion par können graphische
Parameter festgelegt werden. Dies kann
entweder
a)  direkt über die Funktion par vor dem Aufruf
einer High-Level Funktion, wie z.B plot,
b)  oder über das Drei-Punkte-Argument ...
innerhalb der Funktion geschehen.
Üblicher ist letzteres, denn dies verändert nur
den aktuellen Plot. Erstgenannte verändert
alle nachfolgenden Plots.
Die Argumente von par können direkt in die
Funktion plot eingegeben werden
(Datensatz Burt aus Paket car)
cex!
las!

col!

pch!

plot(IQbio, IQfoster, col="darkgrey",!
las=1, pch=16, cex=3)!
Farben – Argument col !
Farben können u.a. als Zahl zwischen 1
und 8

oder als Text definiert werden
"red", "blue", "green", "grey”
... später mehr !
Vektorisierte Argumente
plot(IQbio, IQfoster, col=class,!
las=1, pch=16, cex=4)!
Your turn! – Verändere den
letzten Plot folgendermaßen
Argument pch – point character
Kann ein Vektor mit Zahlen zwischen 1
und 20 sein

oder mit einem Zeichen !!
! ! ! ! ! ! !pch="#"!
Weitere vektorisierte Argumente
cnum <- as.numeric(class)
# umwandeln!
plot(IQbio, IQfoster, col=cnum,!
las=1, pch=cnum, cex=cnum)!
Your turn!
Erstelle folgenden Plot
Your turn!
Erstelle folgenden Plot
par vor plot aufrufen
Anstatt die Argumente für par innerhalb von
plot anzugeben können diese auch vor dem
Aufruf von plot angegeben werden
!par(cex=2)!
!plot(IQbio, Iqfoster)!
!
Allerdings betrifft die Einstellung danach alle
weiteren Plots. Für manche Argumente, wie bg
(background), funktioniert es jedoch nur so.!
Deshalb sollte man nach Erstellung der Grafik
die Ursprungseinstellung von par wieder
herstellen

!

par gibt eine Liste mit den
Einstellungen vor der
Änderung zurück

op <- par(cex=2)!
plot(IQbio, Iqfoster)!
par(op)!
Zurücksetzen auf alte
Einstellungen (in op
gespeichert)
par Aufrufe im Vergleich
!
a)
!
!
!
b)
!

! !op <- par(cex=2)!
! !plot(IQbio, Iqfoster)!
! !par(op)!
! !plot(IQbio, Iqfoster, cex=2)!
... - Argumente
werden an die Funktion
par weitergeleitet
Balkendiagramm mit barplot!

names.arg!

v <- c(1, 3, 2)!
barplot(v, names.arg = c("A", "B", "C"))!
Mehrdimensionale Balkendiagramme!
beside=FALSE!

beside=TRUE!

m <- matrix(c(1, 3, 2, !
2, 2, 4), ncol=3, by=T)!
barplot(m, beside=FALSE, names.arg = !
c("Col 1", "Col 2", "Col 3"))!
Balkendiagramme nutzen aggregierte Daten
(Anzahl pro Kategorie). Die Datenstruktur kann z.B.
mit Hilfe von table erzeugt werden
attach(mtcars)!
cats <- c("3 Gänge", "4 Gänge", "5 Gänge”)!

tbl <- table(gear)!
barplot(tbl, names=cats)!
!
tbl!
3 4 5 !
15 12 5 !
tbl <- table(vs, gear)!
barplot(tbl, names=cats)!
!
tbl!
3 4 5!
0 12 2 4!
1 3 10 1!

prop <- prop.table(tbl, 2)!
barplot(prop, names=cats)!
!
prop!
3
4
5!
0 0.80 0.17 0.80!
1 0.20 0.83 0.20!
!
Your turn! - Erstelle einen Barplot der anzeigt, wieviel
Prozent der Personen pro Jahrgang abschalten
(d.ngo Datensatz aus dem ryouready Paket)
Plot – Eine generische Funktion
Bisher haben wir ein Streudiagramm mit
plot erzeugt. Es existiert jedoch nicht
nur eine, sondern sehr viele Funktionen
mit dem Namen plot.
Welche plot Funktion gemeint ist hängt
davon ab, was für ein Objekt
(Dataframes, Faktoren, Regressionen)
geplottet werden soll.
library(car)!
attach(Burt)!
plot(IQbio, IQfoster)

# numerisch!
Streudia

gramm
plot(Burt)

# dataframe!
Paarwe
ise
Streudia
gramm

e
plot(class, IQbio)

# factor, num.!
Boxplot
plot(class)

# factor!
Balkend

iagram
m
m <- lm(IQbio ~ IQfoster)!
plot(m)
# linear model!
Regress
ion
Plot – Eine generische Funktion
Wenn man die Hilfe zu plot aufruft steht hier
Generic function for plotting of R objects.
Wenn ein Streudiagramm erstellt werden soll,
erkennt R, dass x und y numerisch sind und nutzt
deshalb die Funktion plot.default. Hier stehen in
der Hilfe deutlich mehr Argumente als in plot. !
Zum plotten einer Regression nutzt R die Funktion
plot.lm.
Als Nutzer merkt man dies nicht, wenn man einfach
plot eingibt. Wenn man jedoch die Argumente für
plot sucht, muss man bei der jeweiligen plotFunktion nachschauen.!
Legenden
Legenden können über die Funktion
legend hinzugefügt werden
Es können vier
Typen von
Legende erzeugt
werden:
•  Boxen
•  Linien
•  Symbole
•  Linien + Symbole
!
title!

fill!

legend(x=1, y=10, !
legend=c("Eins","Zwei", !
legend!
"Drei","Vier"), !
fill=1:4, !
title="Boxen")!
ncol=2!
border=“red"!

border!

density!

density=20,
horiz=TRUE!
legend(x=1, y=10, !
legend=c("Eins","Zwei", !
"Drei","Vier"), !
lwd=1, !
title=“Linien")!
lwd:line
width!

lwd=4!
seg.len=5!
seg.len!

lty=1:4!
lty: line
type!
legend(1, 10, !
! ! c("Eins", "Zwei", !
"Drei", "Vier"), !
text.col!
pch=1:4, col=1:4,!
text.col=1:4,!
title="Symbole")!

pch!

pt.cex=c(.5, 1, 1.5, 2)
pt.lwd=c(1,3,6,9)!
pt.cex,
pt.lwd!

pch=1:4!
lwd=4!
merge=TRUE!
title.col!
bg!
y.intersep!

box.lwd!
box.col!

legend(1, 10, !
LETTERS[1:3], !
fill=1:4, !
title.col="blue",!
title="Boxen", !
bg="gray90", !
box.col="red", !
box.lwd=3,!
y.intersp=2)!

cex=2!
Positionieren der Legende
Argumente
•  x!
•  Y !
•  xjust !
•  yjust!

1!
yjust!
0!
0!

xjust!

1!
Über Schlüsselwörter positionieren
Legenden Argumente in Grafik Funktionen
Einige Grafikfunktionen, z.B. barplot, besitzen
Argumente um Legenden automatisch zu generieren

m <- matrix(1:4, 2)!
barplot(m, col = 2:3,!
legend.text = c("A","B")) !

Unschöne
Platzierung!
In dieser Variante wird die Legende ebenfalls
durch die Funktion legend erzeugt. Die Funktion
wird nur hinter den Kulissen durch barplot
automatisch aufgerufen.
Um die Legende anzupassen, können weitere
Argumente an legend über das Argument
args.legend als Liste übergeben werden.
barplot(m, col = 2:3,!
legend.text = c("A", "B"), !
args.legend = !
list(x="topleft”,bty="n"))!
Platzierung
oben links!

Kein Rahmen
um Legende!
Füge zum vorherigen Plot eine
Legende hinzu
Plot in Datei
speichern
Grafik als Datei speichern
R kann unterschiedliche Output Formate
erzeugen. Hierzu stehen u.a. folgende
Funktionen zur Verfügung
## Bitmap Format!
jpeg() ! ! ! ! !#
bmp() ! ! ! ! !#
png() ! ! ! ! !#
!
## Vektorformat!
pdf() ! ! ! ! !#
cairo_pdf
!#
!

öffnet jpeg device!
öffnet bmp device!
öffnet png device!

pdf device öffnen!
Alternative zu pdf()!
Grafikdatei erstellen
Vorgehen für alle Dateitypen:
1.  Grafik Device (Datei) öffnen
2.  Grafikcode (eine / mehrere Zeilen) ausführen
3.  Device (Datei) schließen
pdf("mein_plot.pdf“) !# pdf device öffnen!
!plot(1:10) ! !
# Grafikbefehl(e)!
dev.off()! ! ! ! ! !# device schließen!
!
!
Plot in PDF
●
●

2 4 6 8

1:10

●
●
●
●
●
●
●
●

2

4

6

8

10

Index

Breite in Inch

Höhe in Inch

pdf("mein_plot.pdf", width=5, height=3)!
par(bg="grey95") !
plot(1:10, col="blue", pch=16, ! !!
! ! !main="Plot in PDF")!
dev.off()
Bitmap-Formate
Bei Bitmap-Formaten wird die Größe (width, height)
des Plots in Punkten (Pixel) angegeben. Die Voreinstellung sind 480 Pixel.
Weiterhin gibt es ein Argument res, das die
Auflösung (Feinheit des Plots), d.h. die Anzahl an
Pixeln pro Inch (ppi, default sind 72), angibt.
png("plot.png", width=480, height=480, res=72)!
!par(bg="grey95") !
!plot(1:10)!
dev.off()!
Bitmap Formate und Auflösung
Die Standardeinstellung für z.B. png ist 72 Pixel
pro Inch (ppi). Dies ist für Web-Grafiken der
Standard. Diese Qualität ist jedoch zu gering
für Publikationen. Ziel: 300ppi.
72ppi

300ppi
Die Auflösung kann mit dem Argument res
verändert werden. Setzen wir diese zunächst auf
2 * 72ppi = 144 ppi

Folge: Der Plot ist immer noch 480 Pixel breit. Bei
doppelter Auflösung bedeutet dies effektiv jedoch
nur noch die halbe Breite
Um das gleiche Ergebnis wie zuvor nur mit doppelter
Auflösung zu erhalten, muss die Größe des Plots
(Anzahl der Pixel) ebenfalls um den Faktor 2
vergrößert werden.
Vorher: Einfache Auflösung
und einfache Größe

png("72ppi.png", !
width = 480, height = 480, res = 72)!
plot(1:10)!
dev.off()!
Jetzt: Doppelte Auflösung
und doppelte Größe

png("144ppi.png", !
width = 480*2, height = 480*2, res = 72*2)!
plot(1:10)!
dev.off()!
Typische Fehler
Achtung: Manchmal vergisst man offene
devices wieder zu schließen
dev.list() ! ! !# welche devices sind !
! ! ! ! ! ! !# noch offen?!
!
graphics.off()! !# alle devices schließen!
!
!
Erstelle folgende png-Grafik mit
einer Auflösung von 300 ppi
Plot
Layout
Verschiedene Plot Bereiche

Siehe auch: Clarkson, 2010, http://www.stat.tamu.edu/~jkim/Rfigurelayout.pdf
Verschiedene Plot Bereiche
plot-Bereich: eigentlicher Inhalt des Plots (Punkte,
Linien, Histogramm etc.)
figure-Bereich: Achsen und zugehörige Labels. Breite
wird als Vielfaches einer Zeilenhöhe im Uhrzeigersinn
angegeben (unten, links, oben, rechts). Voreinstellung:
! ! !mar=c(5.1, 4.1, 4.1, 2.1)!
device-Bereich: Umgrenzt einen oder mehrere figure
Bereiche. Wird meist als zusätzlicher Rahmen genutzt.
Voreinstellung:
oma=c(5.1, 4.1, 4.1, 2.1)!
Siehe auch: Clarkson, 2010, http://www.stat.tamu.edu/~jkim/Rfigurelayout.pdf
Verschiedene Plot Bereiche

mar[1] = 5!
oma[1] = 3!
Siehe auch: Clarkson, 2010, chr
Funktionen zu den Bereichen
box(which="plot") !# Rahmen um Plot Bereich!
box(which="figure") # ... um Figure Bereich!
box(which="outer")

# ... um Device Bereich

!!

!
Text im Figure oder Device Bereich
!
mtext("figure links", side=1, !
! ! line= 2, adj=0)!
mtext("device rechts", side=1, !
line= 2, adj=1, outer=TRUE)!
Siehe auch: Clarkson, 2010, http://www.stat.tamu.edu/~jkim/Rfigurelayout.pdf
adj=1!
adj=0!

adj=1!
Your turn! – Verändere den irisDaten Plot folgendermaßen
Anordnen von Plots mit mfrow!
par kennt das Argument mfrow. Dies gibt die
horizontale und vertikal Anzahl an gleich großen
figure Bereichen an
Layout mit
1 Zeile und
2 Spalten!

!
par(mfrow=c(1,2), oma=c(1,1,1,1))!
plot(rnorm(10), rnorm(10))!
hist(rnorm(100))!
mfrow=c(1,2)
Your turn! – Erweitere den irisDaten Plot folgendermaßen
Anordnen von Plots mit layout!
layout erlaubt komplexe Anordnungen. Figure
Bereiche können sich über mehrere Zeilen oder
Spalten erstrecken. Auch kann die Breite und
Höhe jeweils einzeln bestimmt werden.
5 separat
bedruckbare
Figure
Bereiche!

Figure
Bereich 1
über 3
Spalten!

!
Figure
Bereich 5
über 2
Zeilen!
Definition des Layouts
Die Definition des Layouts geschieht mit Hilfe einer
Matrix
m <- matrix(1:4), ncol=2, by=T)!
m!
[,1] [,2]!
[1,]
1
2!
[2,]
3
4!

Das Erstellen und Aktivieren eines Layouts erfolgt
über die Funktion layout!
layout(m)!
Das Layout ist nach dem Erzeugen bereits aktiv. Es
wird in der Reihenfolge der Zahlen in der Matrix
gefüllt

plot(1:10)!
hist(rnorm(100))!
plot(1:10, col=2)!
plot(1:10, col=4)!

Beim Aufruf einer High-Level Funktion wird jeweils
ein neuer Plot-Bereich gefüllt
Visualisierung des Layouts
Zur leichteren Erstellung kann eine Layout
gespeichert und mittels layout.show
visualisiert werden

m <- matrix(1:4), ncol=2, by=T)!
l <- layout(m)!
!
layout.show(l)!
Um einen Figure Bereich über mehrere Zeilen
oder Spalten zu erstrecken, bekommen Felder
in der Layout-Matrix dieselbe Zahl zugeteilt.
Felder mit der Zahl 0 bleiben leer und erhalten
keinen Figure Bereich.
m <- matrix(c(1,1,1,!
2,2,0,!
2,2,3), !
ncol=3, !
byrow=T)!
m!
[,1] [,2] [,3]!
[1,]
1
1
1!
[2,]
2
2
0!
[3,]
2
2
3!
Über die layout Argumente widths und
heights kann das Höhen-Verhältnis der Zeilen
und Breiten-Verhältnis der Spalten zueinander
bestimmt werden.
1
1
:
3

:

3
m <- matrix(1:4, !
ncol=2, !
by=T)!
l <- layout(m, !
widths=c(1,2),
heights=c(1,3))!
!
layout.show(l)!
x <- rnorm(1000)!
y <- rnorm(1000)!
!
# Layout!
par(oma=c(0,0,1,3))!
m <- matrix(c(1,2), ncol=1)!
layout(m, height=c(1,5))!
!
# Histogramm!
par(mar=c(0,4,0,0))!
hist(x, xaxt="n", !
yaxt="n", main="",!
ylab="", xlab="")!
!
# Streudiagramm!
par(mar=c(4,4,0,0))!
plot(x, y, !
xlab="", ylab="", !
las=1, pch=16)!
!
Your turn! – Erzeuge folgenden
Plot mit dem iris-Datensatz
Low-Level
Funktionen
Low-Level Funktionen
Eine High-Level Funktion wie plot greift auf viele
Low-Level Funktionen zurück und baut aus diesen
die Grafik zusammen.
Dabei geschieht u.a. Folgendes:
•  Ein Plot-Bereich mit den Einstellungen für die
Ränder (mar, oma) wird angelegt
•  Die Inhalte (z.B. Punkte werden gedruckt)
•  Die Achsen und die Labels werden hinzugefügt
Nutzung von Low-Level Funktionen
Low-Level Funktionen werden auf zwei Weisen
verwendet:
1.  Nachdem eine High-Level Funktion genutzt
wurde. Z.B. um noch weitere Punkte oder
Linien zum Plot hinzuzufügen
2.  Erstellung einer Grafik von Grund auf (engl.
from sratch)
Einige Low-Level Grafik-Funktionen
points!

Punkte erzeugen

lines!

Linien erzeugen

rect!

Rechtecke erzeugen

polygon!

Polygon erzeugen

abline!

Einfache vert. und horiz. Linien

arrows!

Pfeil erzeugen

text!

Text erzeugen

mtext!

Text in den Rändern erzeugen

title!

Überschrift erzeugen

axis!

Achsen erstellen

grid!

Raster hinzufügen
# Plot aufsetzen!
library(car)!
attach(Burt)!
plot(IQbio, IQfoster)!

# Raster hinzufügen!
grid(lty="solid")!
!
!
# Horiz. und vert. Linien !
abline(h=100, col="red")!
abline(v=100, col="red")!
!
# Punkte oben rechts in!
# rot neu plotten!
i <- IQbio > 100 & !
IQfoster > 100!
points(IQbio[i], IQfoster[i], !
col = "red", pch = 16)!

# Halb-transparentes !
# Rechteck hinzufügen
rect(100, 100, 140, 140,!
col = "#FF000020",
border = NA)!

!
# Regressionsgrade!
m <- lm(IQfoster ~ IQbio, !
data = Burt)!
abline(m, col = "grey")!
!

# Text hinzufügen!
text(120, 120, "OR")!
Your turn! – Erzeuge
folgenden Plot
Leere Plots erzeugen
# Leerer plot mit Limits !
# von Hand!
Keine Daten

plot(NULL, !
xlim = c(70, 130), !
ylim = c(70, 130) )!

# Leerer plot mit passenden!
# Limits!

plot(IQbio, IQfoster, !
type = "n")!
!
„n“ unterdrückt
die Punkte
Text
# Leerer plot mit korrekten!
# Limits!

plot(IQbio, IQfoster, !
type = "n")!
!
„n“ unterdrückt
die Punkte

# Punkte hinzufügen!
points(IQbio, IQfoster, !
col="grey", pch=16)!
# Leerer plot mit korrekten!
# Limits!

i <- which(IQbio > 130)!
x <- IQbio[i]!
y <- IQfoster[i]!
points(x, y, col = "red", !
pch = 16)!

# Pfeil und Text!
arrows(x, y - 10, !
x, y, !
length=0.2, !
lwd = 2, col = "red")!
text(x, y-12, !
"Sehr schlau", !
adj = 1, col = "red")!
Farben in R
Inspired by
http://research.stowers-institute.org/efg/Report/UsingColorInR.pdf
In R können verschiedene Elemente des
Plots Farben annehmen
• 
• 
• 
• 
• 
• 
• 

Punkte
Linien
Achsen
Legenden
Text
Hintergrund
etc.
Überschrift
Legende

Achse

Punkte

Tick
Hintergrund
Tick-Label

Achsen Label
Farben in R
Farben können in R auf unterschiedliche
Art spezifiziert werden
Als Name: "red", "blue”!
!
Als Zahl:
!
Als Hexadezimal-Code: “#12FE99"!
!
Als Zahl
Wenn man eine Zahl eingibt wird die
Standardpalette genutzt

!

palette()!
[1] "black"
[4] "blue"
[7] "yellow"

"red"
"cyan"
"gray" !

"green3" !
"magenta"!

Die Zahl 0 heißt keine Farbe, d.h. weiß,
wenn der Hintergrund der Grafik weiß ist.
Als Zahl
Größere Zahlen führen zu recycleten
Farben

Z.B. plot(1:50, pch=16, col=1:50)!
plot(1:8, pch=16,!
plot(1:24, pch=16,!
cex=4, col=1:8)!
cex=4, col=1:24)!
Farben als Namen
colors()!
[1] "white"
[4] "antiquewhite1"
[7] "antiquewhite4"
[10] "aquamarine2"

"aliceblue"
"antiquewhite2"
"aquamarine"
"aquamarine3"

"antiquewhite"
"antiquewhite3"
"aquamarine1"
"aquamarine4"

!
!
!
!
Erstelle folgenden Plot
Grautöne
grey(0)!
[1] "#000000"!
!
grey(.5)!
[1] "#808080"!
!
grey(1)!
[1] "#FFFFFF"!
!

"grey0"!
!
!
"grey50"!
!
!
"grey100"!
RGB Modell
CC: By SharkD on http://en.wikipedia.org/wiki/File:AdditiveColor.svg

rgb(1,1,1)!
Funktion rgb setzt Farben aus
Rot-Grün-Blau Anteilen
zusammen
Anteil kann jeweils von 0 bis 1
reichen
Die Funktion gibt einen String
zurück

rgb(.4, .2, .8)!
[1] "#6633CC"!
rgb(0,1,0)! rgb(0,1,1)!
RGB Modell
rgb(255,255,255, max=255)!
CC: By SharkD on http://en.wikipedia.org/wiki/File:AdditiveColor.svg

Häufig werden die Anteile
auch mit Werten zwischen 0
und 255 genutzt.
rgb(102, 51, 204, max=255)!
[1] "#6633CC"!

!

rgb(0,255,0,max=255)!
Alpha Parameter
Alpha meint den Grad an Transparenz einer
Farbe. Von 0=undurchlässig, 1=völlig durchlässig.

rgb(1,0,0)!
rgb(1,0,0,.5)!
rgb(1,0,0,.9)!

Transparenz führt, dass
man overplotting
sinnvoll wird
Erstelle folgenden Plot mit 10000
zufälligen Werten ~N(0,1)
RGB Modell in Hexadezimal-Notation
Hex

Dezimal

0

0

1

1

2

2

3

3

4

4

5

5

6

6

7

7

8

8

9

9

A

10

B

11

C

12

D

13

E

14

F

15

rgb(0,255,0, max=255)!
[1] "#00FF00"!
Dezimalsystem mit Basis 10

255 = 2 ⋅101 + 5⋅101 + 5⋅10 0
Hexa-Dezimalsystem mit Basis 16
1

255 = 15⋅16 +15⋅16
F

0

F

Merksatz: 0=00 und 255=FF, alles
andere liegt dazwischen
RGB Modell in Hexadezimal-Notation
Hex

Dezimal

0

0

1

1

2

2

3

3

4

4

5

5

6

6

7

7

8

8

9

9

A

10

B

11

C

12

D

13

E

14

F

15

Hex-Werte beginnen mit einer
Raute:
"#00FF00"!
An der viertel Position kann auch
hier Alpha angegeben werden
"#00FF0010"!
Alpha
R base graphics

Weitere ähnliche Inhalte

Ähnlich wie R base graphics

Scala : Monads for the Pragmatic Programmer , Composition with Stackable Traits
Scala : Monads for the Pragmatic Programmer , Composition with Stackable TraitsScala : Monads for the Pragmatic Programmer , Composition with Stackable Traits
Scala : Monads for the Pragmatic Programmer , Composition with Stackable Traits
Andreas Neumann
 
R-Programmierung: Streu- und Liniendiagramme plotten
R-Programmierung: Streu- und Liniendiagramme plottenR-Programmierung: Streu- und Liniendiagramme plotten
R-Programmierung: Streu- und Liniendiagramme plotten
mandson
 
A fool with a tool
A fool with a toolA fool with a tool
A fool with a tool
Markus Uhl
 
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen IBIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
Institute for Digital Humanities, University of Cologne
 
Eine Reise durch den PostgreSQL Optimizer
Eine Reise durch den PostgreSQL OptimizerEine Reise durch den PostgreSQL Optimizer
Eine Reise durch den PostgreSQL Optimizer
psoo1978
 

Ähnlich wie R base graphics (6)

Messen mit LabVIEW- Block 3
Messen mit LabVIEW- Block 3Messen mit LabVIEW- Block 3
Messen mit LabVIEW- Block 3
 
Scala : Monads for the Pragmatic Programmer , Composition with Stackable Traits
Scala : Monads for the Pragmatic Programmer , Composition with Stackable TraitsScala : Monads for the Pragmatic Programmer , Composition with Stackable Traits
Scala : Monads for the Pragmatic Programmer , Composition with Stackable Traits
 
R-Programmierung: Streu- und Liniendiagramme plotten
R-Programmierung: Streu- und Liniendiagramme plottenR-Programmierung: Streu- und Liniendiagramme plotten
R-Programmierung: Streu- und Liniendiagramme plotten
 
A fool with a tool
A fool with a toolA fool with a tool
A fool with a tool
 
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen IBIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
 
Eine Reise durch den PostgreSQL Optimizer
Eine Reise durch den PostgreSQL OptimizerEine Reise durch den PostgreSQL Optimizer
Eine Reise durch den PostgreSQL Optimizer
 

Mehr von Mark Heckmann

Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...
Mark Heckmann
 
The OpenRepGrid project – Software tools for the analysis and administration...
The OpenRepGrid project – Software tools  for the analysis and administration...The OpenRepGrid project – Software tools  for the analysis and administration...
The OpenRepGrid project – Software tools for the analysis and administration...
Mark Heckmann
 
Knitr Formeln - R
Knitr Formeln - RKnitr Formeln - R
Knitr Formeln - R
Mark Heckmann
 
A new development in the hierarchical clustering of repertory grid data
A new development in the hierarchical clustering of repertory grid dataA new development in the hierarchical clustering of repertory grid data
A new development in the hierarchical clustering of repertory grid data
Mark Heckmann
 
OpenRepGrid and Friends
OpenRepGrid and FriendsOpenRepGrid and Friends
OpenRepGrid and Friends
Mark Heckmann
 
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni BremenR-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
Mark Heckmann
 
R kurs so se 2010 uni bremen m. heckmann
R kurs so se 2010 uni bremen   m. heckmannR kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen m. heckmann
Mark Heckmann
 
Übersicht Glm Workshop 2009
Übersicht Glm Workshop 2009Übersicht Glm Workshop 2009
Übersicht Glm Workshop 2009
Mark Heckmann
 

Mehr von Mark Heckmann (8)

Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...
 
The OpenRepGrid project – Software tools for the analysis and administration...
The OpenRepGrid project – Software tools  for the analysis and administration...The OpenRepGrid project – Software tools  for the analysis and administration...
The OpenRepGrid project – Software tools for the analysis and administration...
 
Knitr Formeln - R
Knitr Formeln - RKnitr Formeln - R
Knitr Formeln - R
 
A new development in the hierarchical clustering of repertory grid data
A new development in the hierarchical clustering of repertory grid dataA new development in the hierarchical clustering of repertory grid data
A new development in the hierarchical clustering of repertory grid data
 
OpenRepGrid and Friends
OpenRepGrid and FriendsOpenRepGrid and Friends
OpenRepGrid and Friends
 
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni BremenR-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
 
R kurs so se 2010 uni bremen m. heckmann
R kurs so se 2010 uni bremen   m. heckmannR kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen m. heckmann
 
Übersicht Glm Workshop 2009
Übersicht Glm Workshop 2009Übersicht Glm Workshop 2009
Übersicht Glm Workshop 2009
 

R base graphics

  • 1. R base graphics Mark Heckmann University of Bremen, Germany www.markheckmann.de Version Januar, 2014 © CC BY-NC 2.0 DE
  • 2. Zwei Grafiksysteme (base) graphics •  Älteres System •  Sehr schnell •  Sehr viele vereinzelte Funktionen grid graphics lattice ggplot2
  • 3. Arten von base graphics Funktionen High-Level functions Erstellen komplexer Grafiken, z.B. (hist) Low-Level functions Erstellung von Linien, Punkte, Achsen etc. oftmals on-top auf High-Level Funktion
  • 6. Don‘t get fooled by default looks: Mit R base graphics kann man wunderschöne Grafiken produzieren. Allerdings benötigt dies meist viel Code ! par(mai=c(0.5,1,0.5,0.5),! omi=c(0.5,0.5,0.5,0.5),! family="Lato Light",las=1)! frauen <- read.csv("daten/frauen.txt",header =F,sep=",")! for(i in 1:111) ! colnames(frauen)[i]<-paste("x",i+1949,sep="") ! maenner<-read.csv("daten/maenner.txt",header =F,sep=",")! for(i in 1:111) ! colnames(maenner)[i]<-paste("x",i+1949,sep="")! rechts<-frauen$x2010! links<-maenner$x2010! farbe_rechts<-c(! rep(rgb(210,210,210,maxColorValue=255),15),! rep(rgb(144,157,172,maxColorValue=255),50),! rep(rgb(225,152,105,maxColorValue=255),! length(rechts)-65))! farbe_links<-farbe_rechts! barplot(rechts,axes=F,horiz=T,axis.lty=0,! border=NA, col=farbe_rechts,xlim=c(-750,750))! barplot(-links,axes=F,horiz=T,axis.lty=0,border=NA, ! col=farbe_links,xlim=c(-750,750),add=T)! abline(v=0,lwd=28,col=par("bg"))! for (i in seq(10,90,by=10)) text(0,i+i*0.2,i,cex=1.1) ! mtext(abs(seq(-600,600,by=200)),! at=seq(-600,600,by=200), 1,line=-1,cex=0.80)! rect(-1000,15+15*0.2,1000,66+66*0.2,xpd=T, ! col=rgb(210,210,210,90,maxColorValue=255),! border=NA)! mtext("erwerbsfähiges Alter",2,line=1.5,las=3,adj=0.38) ! mtext("Männer",3,line=-5,adj=0.25,cex=1.5,col="grey") ! mtext("Frauen",3,line=-5,adj=0.75,cex=1.5,col="grey") ! mtext("Altersaufb...",3,line=-1.5,adj=0,cex=1.75,! family="Lato Black",outer=T) ! mtext("Angaben in...",3,line=-3.25,adj=0,cex=1.25,! font=3,outer=T) ! mtext("Quelle: ww...",1,line=0,adj=1.0,cex=0.95,! font=3,outer=T)! Rahlf, T. (2014) Datendesign mit R, S. 222 ff.
  • 7. Histogramm mit hist! x <- rnorm(1000)! hist(x)!
  • 8. ?hist - Argumente von hist! hist(x, breaks = "Sturges",! !freq = NULL, probability = !freq,! !include.lowest = TRUE, right = TRUE,! !density = NULL, angle = 45, ! ! !col = NULL, border = NULL! ! !main = paste("Histogram of" , xname),! !xlim = range(breaks), ylim = NULL,! !xlab = xname, ylab,! !axes = TRUE, plot = TRUE, ! Noch mehr ! !labels = FALSE,! Argumente. Mehr dazu !nclass = NULL, ! später ... ! !warn.unused = TRUE, ...)!
  • 9. main! col! ylab! ylim! border! xlim! breaks! xlab! hist(x, breaks=25, col="grey", main="Histogramm", ! xlab="Werte von x", ylab="Häufigkeit",! ylim=c(0, 100), xlim=c(-5, 5),! border="white")!
  • 10. Your turn! - Erstelle folgendes Histogramm mit zufälligen Werten mit dem Datensatz
  • 11. Streudiagramm mit plot! main! ylab! type! ylim! xlim! xlab! plot(x=IQbio, y=IQfoster, type="p",! xlab="IQ of twin raised by biological parents",! ylab="IQ of twin raised by foster parents",! main="IQ - Zwilling im Vergleich",! xlim=c(60, 140), ylim=c(60, 140))!
  • 12. Your turn! - Erstelle folgenden Plot mit dem iris Datensatz
  • 13. Einstellung graphischer Parameter ?par # > 50 Parameter! bg cex col! las lwd pch Hintergrundfarbe des Plots Größe des Texts im Plot Farbe der dargestellten Elemente Stil der Achsenbeschriftung Breite von gezeichneten Linien Art des dargestellte Symbols
  • 14. Graphical parameters Über die Funktion par können graphische Parameter festgelegt werden. Dies kann entweder a)  direkt über die Funktion par vor dem Aufruf einer High-Level Funktion, wie z.B plot, b)  oder über das Drei-Punkte-Argument ... innerhalb der Funktion geschehen. Üblicher ist letzteres, denn dies verändert nur den aktuellen Plot. Erstgenannte verändert alle nachfolgenden Plots.
  • 15. Die Argumente von par können direkt in die Funktion plot eingegeben werden (Datensatz Burt aus Paket car) cex! las! col! pch! plot(IQbio, IQfoster, col="darkgrey",! las=1, pch=16, cex=3)!
  • 16. Farben – Argument col ! Farben können u.a. als Zahl zwischen 1 und 8 oder als Text definiert werden "red", "blue", "green", "grey” ... später mehr !
  • 17. Vektorisierte Argumente plot(IQbio, IQfoster, col=class,! las=1, pch=16, cex=4)!
  • 18. Your turn! – Verändere den letzten Plot folgendermaßen
  • 19. Argument pch – point character Kann ein Vektor mit Zahlen zwischen 1 und 20 sein oder mit einem Zeichen !! ! ! ! ! ! ! !pch="#"!
  • 20. Weitere vektorisierte Argumente cnum <- as.numeric(class) # umwandeln! plot(IQbio, IQfoster, col=cnum,! las=1, pch=cnum, cex=cnum)!
  • 23. par vor plot aufrufen Anstatt die Argumente für par innerhalb von plot anzugeben können diese auch vor dem Aufruf von plot angegeben werden !par(cex=2)! !plot(IQbio, Iqfoster)! ! Allerdings betrifft die Einstellung danach alle weiteren Plots. Für manche Argumente, wie bg (background), funktioniert es jedoch nur so.!
  • 24. Deshalb sollte man nach Erstellung der Grafik die Ursprungseinstellung von par wieder herstellen ! par gibt eine Liste mit den Einstellungen vor der Änderung zurück op <- par(cex=2)! plot(IQbio, Iqfoster)! par(op)! Zurücksetzen auf alte Einstellungen (in op gespeichert)
  • 25. par Aufrufe im Vergleich ! a) ! ! ! b) ! ! !op <- par(cex=2)! ! !plot(IQbio, Iqfoster)! ! !par(op)! ! !plot(IQbio, Iqfoster, cex=2)! ... - Argumente werden an die Funktion par weitergeleitet
  • 26. Balkendiagramm mit barplot! names.arg! v <- c(1, 3, 2)! barplot(v, names.arg = c("A", "B", "C"))!
  • 27. Mehrdimensionale Balkendiagramme! beside=FALSE! beside=TRUE! m <- matrix(c(1, 3, 2, ! 2, 2, 4), ncol=3, by=T)! barplot(m, beside=FALSE, names.arg = ! c("Col 1", "Col 2", "Col 3"))!
  • 28. Balkendiagramme nutzen aggregierte Daten (Anzahl pro Kategorie). Die Datenstruktur kann z.B. mit Hilfe von table erzeugt werden attach(mtcars)! cats <- c("3 Gänge", "4 Gänge", "5 Gänge”)! tbl <- table(gear)! barplot(tbl, names=cats)! ! tbl! 3 4 5 ! 15 12 5 !
  • 29. tbl <- table(vs, gear)! barplot(tbl, names=cats)! ! tbl! 3 4 5! 0 12 2 4! 1 3 10 1! prop <- prop.table(tbl, 2)! barplot(prop, names=cats)! ! prop! 3 4 5! 0 0.80 0.17 0.80! 1 0.20 0.83 0.20! !
  • 30. Your turn! - Erstelle einen Barplot der anzeigt, wieviel Prozent der Personen pro Jahrgang abschalten (d.ngo Datensatz aus dem ryouready Paket)
  • 31. Plot – Eine generische Funktion Bisher haben wir ein Streudiagramm mit plot erzeugt. Es existiert jedoch nicht nur eine, sondern sehr viele Funktionen mit dem Namen plot. Welche plot Funktion gemeint ist hängt davon ab, was für ein Objekt (Dataframes, Faktoren, Regressionen) geplottet werden soll. library(car)! attach(Burt)!
  • 36. m <- lm(IQbio ~ IQfoster)! plot(m) # linear model! Regress ion
  • 37. Plot – Eine generische Funktion Wenn man die Hilfe zu plot aufruft steht hier Generic function for plotting of R objects. Wenn ein Streudiagramm erstellt werden soll, erkennt R, dass x und y numerisch sind und nutzt deshalb die Funktion plot.default. Hier stehen in der Hilfe deutlich mehr Argumente als in plot. ! Zum plotten einer Regression nutzt R die Funktion plot.lm. Als Nutzer merkt man dies nicht, wenn man einfach plot eingibt. Wenn man jedoch die Argumente für plot sucht, muss man bei der jeweiligen plotFunktion nachschauen.!
  • 39. Legenden können über die Funktion legend hinzugefügt werden Es können vier Typen von Legende erzeugt werden: •  Boxen •  Linien •  Symbole •  Linien + Symbole !
  • 40. title! fill! legend(x=1, y=10, ! legend=c("Eins","Zwei", ! legend! "Drei","Vier"), ! fill=1:4, ! title="Boxen")! ncol=2! border=“red"! border! density! density=20, horiz=TRUE!
  • 41. legend(x=1, y=10, ! legend=c("Eins","Zwei", ! "Drei","Vier"), ! lwd=1, ! title=“Linien")! lwd:line width! lwd=4! seg.len=5! seg.len! lty=1:4! lty: line type!
  • 42. legend(1, 10, ! ! ! c("Eins", "Zwei", ! "Drei", "Vier"), ! text.col! pch=1:4, col=1:4,! text.col=1:4,! title="Symbole")! pch! pt.cex=c(.5, 1, 1.5, 2) pt.lwd=c(1,3,6,9)! pt.cex, pt.lwd! pch=1:4! lwd=4! merge=TRUE!
  • 43. title.col! bg! y.intersep! box.lwd! box.col! legend(1, 10, ! LETTERS[1:3], ! fill=1:4, ! title.col="blue",! title="Boxen", ! bg="gray90", ! box.col="red", ! box.lwd=3,! y.intersp=2)! cex=2!
  • 44. Positionieren der Legende Argumente •  x! •  Y ! •  xjust ! •  yjust! 1! yjust! 0! 0! xjust! 1!
  • 46. Legenden Argumente in Grafik Funktionen Einige Grafikfunktionen, z.B. barplot, besitzen Argumente um Legenden automatisch zu generieren m <- matrix(1:4, 2)! barplot(m, col = 2:3,! legend.text = c("A","B")) ! Unschöne Platzierung!
  • 47. In dieser Variante wird die Legende ebenfalls durch die Funktion legend erzeugt. Die Funktion wird nur hinter den Kulissen durch barplot automatisch aufgerufen. Um die Legende anzupassen, können weitere Argumente an legend über das Argument args.legend als Liste übergeben werden. barplot(m, col = 2:3,! legend.text = c("A", "B"), ! args.legend = ! list(x="topleft”,bty="n"))! Platzierung oben links! Kein Rahmen um Legende!
  • 48. Füge zum vorherigen Plot eine Legende hinzu
  • 50. Grafik als Datei speichern R kann unterschiedliche Output Formate erzeugen. Hierzu stehen u.a. folgende Funktionen zur Verfügung ## Bitmap Format! jpeg() ! ! ! ! !# bmp() ! ! ! ! !# png() ! ! ! ! !# ! ## Vektorformat! pdf() ! ! ! ! !# cairo_pdf !# ! öffnet jpeg device! öffnet bmp device! öffnet png device! pdf device öffnen! Alternative zu pdf()!
  • 51. Grafikdatei erstellen Vorgehen für alle Dateitypen: 1.  Grafik Device (Datei) öffnen 2.  Grafikcode (eine / mehrere Zeilen) ausführen 3.  Device (Datei) schließen pdf("mein_plot.pdf“) !# pdf device öffnen! !plot(1:10) ! ! # Grafikbefehl(e)! dev.off()! ! ! ! ! !# device schließen! ! !
  • 52. Plot in PDF ● ● 2 4 6 8 1:10 ● ● ● ● ● ● ● ● 2 4 6 8 10 Index Breite in Inch Höhe in Inch pdf("mein_plot.pdf", width=5, height=3)! par(bg="grey95") ! plot(1:10, col="blue", pch=16, ! !! ! ! !main="Plot in PDF")! dev.off()
  • 53. Bitmap-Formate Bei Bitmap-Formaten wird die Größe (width, height) des Plots in Punkten (Pixel) angegeben. Die Voreinstellung sind 480 Pixel. Weiterhin gibt es ein Argument res, das die Auflösung (Feinheit des Plots), d.h. die Anzahl an Pixeln pro Inch (ppi, default sind 72), angibt. png("plot.png", width=480, height=480, res=72)! !par(bg="grey95") ! !plot(1:10)! dev.off()!
  • 54. Bitmap Formate und Auflösung Die Standardeinstellung für z.B. png ist 72 Pixel pro Inch (ppi). Dies ist für Web-Grafiken der Standard. Diese Qualität ist jedoch zu gering für Publikationen. Ziel: 300ppi. 72ppi 300ppi
  • 55. Die Auflösung kann mit dem Argument res verändert werden. Setzen wir diese zunächst auf 2 * 72ppi = 144 ppi Folge: Der Plot ist immer noch 480 Pixel breit. Bei doppelter Auflösung bedeutet dies effektiv jedoch nur noch die halbe Breite
  • 56. Um das gleiche Ergebnis wie zuvor nur mit doppelter Auflösung zu erhalten, muss die Größe des Plots (Anzahl der Pixel) ebenfalls um den Faktor 2 vergrößert werden. Vorher: Einfache Auflösung und einfache Größe png("72ppi.png", ! width = 480, height = 480, res = 72)! plot(1:10)! dev.off()! Jetzt: Doppelte Auflösung und doppelte Größe png("144ppi.png", ! width = 480*2, height = 480*2, res = 72*2)! plot(1:10)! dev.off()!
  • 57. Typische Fehler Achtung: Manchmal vergisst man offene devices wieder zu schließen dev.list() ! ! !# welche devices sind ! ! ! ! ! ! ! !# noch offen?! ! graphics.off()! !# alle devices schließen! ! !
  • 58. Erstelle folgende png-Grafik mit einer Auflösung von 300 ppi
  • 60. Verschiedene Plot Bereiche Siehe auch: Clarkson, 2010, http://www.stat.tamu.edu/~jkim/Rfigurelayout.pdf
  • 61. Verschiedene Plot Bereiche plot-Bereich: eigentlicher Inhalt des Plots (Punkte, Linien, Histogramm etc.) figure-Bereich: Achsen und zugehörige Labels. Breite wird als Vielfaches einer Zeilenhöhe im Uhrzeigersinn angegeben (unten, links, oben, rechts). Voreinstellung: ! ! !mar=c(5.1, 4.1, 4.1, 2.1)! device-Bereich: Umgrenzt einen oder mehrere figure Bereiche. Wird meist als zusätzlicher Rahmen genutzt. Voreinstellung: oma=c(5.1, 4.1, 4.1, 2.1)! Siehe auch: Clarkson, 2010, http://www.stat.tamu.edu/~jkim/Rfigurelayout.pdf
  • 62. Verschiedene Plot Bereiche mar[1] = 5! oma[1] = 3! Siehe auch: Clarkson, 2010, chr
  • 63. Funktionen zu den Bereichen box(which="plot") !# Rahmen um Plot Bereich! box(which="figure") # ... um Figure Bereich! box(which="outer") # ... um Device Bereich !! ! Text im Figure oder Device Bereich ! mtext("figure links", side=1, ! ! ! line= 2, adj=0)! mtext("device rechts", side=1, ! line= 2, adj=1, outer=TRUE)! Siehe auch: Clarkson, 2010, http://www.stat.tamu.edu/~jkim/Rfigurelayout.pdf
  • 65. Your turn! – Verändere den irisDaten Plot folgendermaßen
  • 66. Anordnen von Plots mit mfrow! par kennt das Argument mfrow. Dies gibt die horizontale und vertikal Anzahl an gleich großen figure Bereichen an Layout mit 1 Zeile und 2 Spalten! ! par(mfrow=c(1,2), oma=c(1,1,1,1))! plot(rnorm(10), rnorm(10))! hist(rnorm(100))!
  • 68. Your turn! – Erweitere den irisDaten Plot folgendermaßen
  • 69. Anordnen von Plots mit layout! layout erlaubt komplexe Anordnungen. Figure Bereiche können sich über mehrere Zeilen oder Spalten erstrecken. Auch kann die Breite und Höhe jeweils einzeln bestimmt werden. 5 separat bedruckbare Figure Bereiche! Figure Bereich 1 über 3 Spalten! ! Figure Bereich 5 über 2 Zeilen!
  • 70. Definition des Layouts Die Definition des Layouts geschieht mit Hilfe einer Matrix m <- matrix(1:4), ncol=2, by=T)! m! [,1] [,2]! [1,] 1 2! [2,] 3 4! Das Erstellen und Aktivieren eines Layouts erfolgt über die Funktion layout! layout(m)!
  • 71. Das Layout ist nach dem Erzeugen bereits aktiv. Es wird in der Reihenfolge der Zahlen in der Matrix gefüllt plot(1:10)! hist(rnorm(100))! plot(1:10, col=2)! plot(1:10, col=4)! Beim Aufruf einer High-Level Funktion wird jeweils ein neuer Plot-Bereich gefüllt
  • 72. Visualisierung des Layouts Zur leichteren Erstellung kann eine Layout gespeichert und mittels layout.show visualisiert werden m <- matrix(1:4), ncol=2, by=T)! l <- layout(m)! ! layout.show(l)!
  • 73. Um einen Figure Bereich über mehrere Zeilen oder Spalten zu erstrecken, bekommen Felder in der Layout-Matrix dieselbe Zahl zugeteilt. Felder mit der Zahl 0 bleiben leer und erhalten keinen Figure Bereich. m <- matrix(c(1,1,1,! 2,2,0,! 2,2,3), ! ncol=3, ! byrow=T)! m! [,1] [,2] [,3]! [1,] 1 1 1! [2,] 2 2 0! [3,] 2 2 3!
  • 74. Über die layout Argumente widths und heights kann das Höhen-Verhältnis der Zeilen und Breiten-Verhältnis der Spalten zueinander bestimmt werden. 1 1 : 3 : 3 m <- matrix(1:4, ! ncol=2, ! by=T)! l <- layout(m, ! widths=c(1,2), heights=c(1,3))! ! layout.show(l)!
  • 75. x <- rnorm(1000)! y <- rnorm(1000)! ! # Layout! par(oma=c(0,0,1,3))! m <- matrix(c(1,2), ncol=1)! layout(m, height=c(1,5))! ! # Histogramm! par(mar=c(0,4,0,0))! hist(x, xaxt="n", ! yaxt="n", main="",! ylab="", xlab="")! ! # Streudiagramm! par(mar=c(4,4,0,0))! plot(x, y, ! xlab="", ylab="", ! las=1, pch=16)! !
  • 76. Your turn! – Erzeuge folgenden Plot mit dem iris-Datensatz
  • 78. Low-Level Funktionen Eine High-Level Funktion wie plot greift auf viele Low-Level Funktionen zurück und baut aus diesen die Grafik zusammen. Dabei geschieht u.a. Folgendes: •  Ein Plot-Bereich mit den Einstellungen für die Ränder (mar, oma) wird angelegt •  Die Inhalte (z.B. Punkte werden gedruckt) •  Die Achsen und die Labels werden hinzugefügt
  • 79. Nutzung von Low-Level Funktionen Low-Level Funktionen werden auf zwei Weisen verwendet: 1.  Nachdem eine High-Level Funktion genutzt wurde. Z.B. um noch weitere Punkte oder Linien zum Plot hinzuzufügen 2.  Erstellung einer Grafik von Grund auf (engl. from sratch)
  • 80. Einige Low-Level Grafik-Funktionen points! Punkte erzeugen lines! Linien erzeugen rect! Rechtecke erzeugen polygon! Polygon erzeugen abline! Einfache vert. und horiz. Linien arrows! Pfeil erzeugen text! Text erzeugen mtext! Text in den Rändern erzeugen title! Überschrift erzeugen axis! Achsen erstellen grid! Raster hinzufügen
  • 81. # Plot aufsetzen! library(car)! attach(Burt)! plot(IQbio, IQfoster)! # Raster hinzufügen! grid(lty="solid")! ! ! # Horiz. und vert. Linien ! abline(h=100, col="red")! abline(v=100, col="red")! !
  • 82. # Punkte oben rechts in! # rot neu plotten! i <- IQbio > 100 & ! IQfoster > 100! points(IQbio[i], IQfoster[i], ! col = "red", pch = 16)! # Halb-transparentes ! # Rechteck hinzufügen rect(100, 100, 140, 140,! col = "#FF000020", border = NA)! !
  • 83. # Regressionsgrade! m <- lm(IQfoster ~ IQbio, ! data = Burt)! abline(m, col = "grey")! ! # Text hinzufügen! text(120, 120, "OR")!
  • 84. Your turn! – Erzeuge folgenden Plot
  • 85. Leere Plots erzeugen # Leerer plot mit Limits ! # von Hand! Keine Daten plot(NULL, ! xlim = c(70, 130), ! ylim = c(70, 130) )! # Leerer plot mit passenden! # Limits! plot(IQbio, IQfoster, ! type = "n")! ! „n“ unterdrückt die Punkte
  • 86. Text
  • 87. # Leerer plot mit korrekten! # Limits! plot(IQbio, IQfoster, ! type = "n")! ! „n“ unterdrückt die Punkte # Punkte hinzufügen! points(IQbio, IQfoster, ! col="grey", pch=16)!
  • 88. # Leerer plot mit korrekten! # Limits! i <- which(IQbio > 130)! x <- IQbio[i]! y <- IQfoster[i]! points(x, y, col = "red", ! pch = 16)! # Pfeil und Text! arrows(x, y - 10, ! x, y, ! length=0.2, ! lwd = 2, col = "red")! text(x, y-12, ! "Sehr schlau", ! adj = 1, col = "red")!
  • 89. Farben in R Inspired by http://research.stowers-institute.org/efg/Report/UsingColorInR.pdf
  • 90. In R können verschiedene Elemente des Plots Farben annehmen •  •  •  •  •  •  •  Punkte Linien Achsen Legenden Text Hintergrund etc.
  • 92. Farben in R Farben können in R auf unterschiedliche Art spezifiziert werden Als Name: "red", "blue”! ! Als Zahl: ! Als Hexadezimal-Code: “#12FE99"! !
  • 93. Als Zahl Wenn man eine Zahl eingibt wird die Standardpalette genutzt ! palette()! [1] "black" [4] "blue" [7] "yellow" "red" "cyan" "gray" ! "green3" ! "magenta"! Die Zahl 0 heißt keine Farbe, d.h. weiß, wenn der Hintergrund der Grafik weiß ist.
  • 94. Als Zahl Größere Zahlen führen zu recycleten Farben Z.B. plot(1:50, pch=16, col=1:50)!
  • 95. plot(1:8, pch=16,! plot(1:24, pch=16,! cex=4, col=1:8)! cex=4, col=1:24)!
  • 96. Farben als Namen colors()! [1] "white" [4] "antiquewhite1" [7] "antiquewhite4" [10] "aquamarine2" "aliceblue" "antiquewhite2" "aquamarine" "aquamarine3" "antiquewhite" "antiquewhite3" "aquamarine1" "aquamarine4" ! ! ! !
  • 98. Grautöne grey(0)! [1] "#000000"! ! grey(.5)! [1] "#808080"! ! grey(1)! [1] "#FFFFFF"! ! "grey0"! ! ! "grey50"! ! ! "grey100"!
  • 99. RGB Modell CC: By SharkD on http://en.wikipedia.org/wiki/File:AdditiveColor.svg rgb(1,1,1)! Funktion rgb setzt Farben aus Rot-Grün-Blau Anteilen zusammen Anteil kann jeweils von 0 bis 1 reichen Die Funktion gibt einen String zurück rgb(.4, .2, .8)! [1] "#6633CC"! rgb(0,1,0)! rgb(0,1,1)!
  • 100. RGB Modell rgb(255,255,255, max=255)! CC: By SharkD on http://en.wikipedia.org/wiki/File:AdditiveColor.svg Häufig werden die Anteile auch mit Werten zwischen 0 und 255 genutzt. rgb(102, 51, 204, max=255)! [1] "#6633CC"! ! rgb(0,255,0,max=255)!
  • 101. Alpha Parameter Alpha meint den Grad an Transparenz einer Farbe. Von 0=undurchlässig, 1=völlig durchlässig. rgb(1,0,0)! rgb(1,0,0,.5)! rgb(1,0,0,.9)! Transparenz führt, dass man overplotting sinnvoll wird
  • 102. Erstelle folgenden Plot mit 10000 zufälligen Werten ~N(0,1)
  • 103. RGB Modell in Hexadezimal-Notation Hex Dezimal 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 A 10 B 11 C 12 D 13 E 14 F 15 rgb(0,255,0, max=255)! [1] "#00FF00"! Dezimalsystem mit Basis 10 255 = 2 ⋅101 + 5⋅101 + 5⋅10 0 Hexa-Dezimalsystem mit Basis 16 1 255 = 15⋅16 +15⋅16 F 0 F Merksatz: 0=00 und 255=FF, alles andere liegt dazwischen
  • 104. RGB Modell in Hexadezimal-Notation Hex Dezimal 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 A 10 B 11 C 12 D 13 E 14 F 15 Hex-Werte beginnen mit einer Raute: "#00FF00"! An der viertel Position kann auch hier Alpha angegeben werden "#00FF0010"! Alpha