---
title: "L2: Abbildungen in R"
author: "Jonathan Harrington / Ulrich Reubold"
date: "April 2018"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

Bibliotheken und Data-Frames laden:
```{r,eval=FALSE}
# ggf.: 
install.packages('ggplot2')
install.packages('gridExtra')
```
```{r,echo=FALSE}
pfad = "/Users/reubold/Documents/R"
```
```{r}
pfadu = "http://www.phonetik.uni-muenchen.de/~jmh/lehre/Rdf"
library(ggplot2)
#VOR der Vorlesung:
#Alles zwischen ### ### an einem Ort mit stabiler Internetverbindung durchführen

###
asp = read.table(file.path(pfadu, "asp.txt"))
coronal = read.table(file.path(pfadu, "coronal.txt"))
int.df = read.table(file.path(pfadu, "intdauer.txt"))
v.df = read.table(file.path(pfadu, "vdata.txt"))
save(list=c("asp","coronal","int.df","v.df"),file=file.path(pfad, "L2.RData"))
###

#dann
load(file.path(pfad, "L2.RData"))
```

##0. Einleitung
Zur Erinnerung, `df` ist ein Data-Frame.

Ein Data-Frames besteht aus 

* Reihen (Beobachtungen) 

und

* Spalten (Variablen)

```{r}
# Prüfen, ob es ein Data-Frame ist:
class(asp)
# die ersten paar Beobachtungen:
head(coronal)
```

#### Zugriff auf Elemente
```{r,eval=FALSE}
coronal[r,s]  #Zugriff auf Reihe(n) r und Spalte(n) s
```
also z.B.:
```{r}
coronal[2,2:4]
```

##1. Numerische und kategoriale Variablen
Die Spalten können **numerische** und **kategoriale** Variablen enthalten. 

####Numerische Variablen: Ganzzahlen (`integer`) oder kontinuierlich (`numeric`):

```{r}
asp$d[1:5]
class(asp$d)
# oder
with(asp, class(d))

int.df$Dauer[1:5]
class(int.df$Dauer)
```

####Kategoriale Variablen sind Faktoren mit Stufen:
```{r}
class(coronal$Socialclass)
# [1] "factor"

# Die Stufen davon. z.B. die ersten paar anschauen...
coronal$Socialclass[1:10]
# oder
levels(coronal$Socialclass)
```

## 2. Typische Untersuchungen in der Phonetik

### Wird y von x beeinflusst?

####1. y = numerisch, x = kategorial

* 1.1 z.B. *unterscheiden sich /i, e, a/ in der Dauer?*
* 1.2 = **Inwiefern wird die Dauer (y) vom Vokal (x) beeinflusst?**
* 1.3 Abbildungen dafür: `geom_boxplot()` 
    + auch: `geom_histogram()`  und `stat_density()`

####2. y = kategorial, x = kategorial

* 2.1 z.B. *Wörter wie Sohn, Sonne... können mit /s/ oder /z/ produziert werden. Kommt /s/ eher in Bayern und /z/ eher in Hamburg vor?*
* 2.2 = **Inwiefern wird die Stimmhaftigkeit (y: ob /s/ oder /z/) vom Dialekt (x: oben Bayern oder Hamburg) V) beeinflusst?**
* 2.3 Abbildungen dafür: `geom_barchart()`

####3. y = numerisch, x = numerisch 

* 3.1 z.B. *gibt es eine größere Dauer bei einer größeren Mundöffnung?*
* 3.2 **Inwiefern wird die Dauer (y) von der Mundöffnung (x) beeinflusst?**
* 3.3 Abbildung dafür: xy-Plot über `geom_point()` und/oder `geom_line()`

### Zusammenfassung: 

* 1. y = numerisch, x = kategorial: `geom_boxplot()`.  Auch `geom_histogram()`, `stat_density()`

* 2. y = kategorial, x = kategorial: `geom_bar()`

* 3. y = numerisch, x = numerisch: `geom_point()`, `geom_line()`

####Siehe auch die Handbücher zu 

* R und Abbildungen im Allgemeinen http://www.cookbook-r.com/
* zu ggplot2 im Speziellen (gg = grammar of graphics) http://docs.ggplot2.org/current/

Syntax in ggplot2:
```{r,eval=FALSE}
A + 
  B + 
  C + 
  D + 
  ...
```

`A`, `B`, `C`... sind modulare Befehle, die durch `+` aneinandergehängt werden.

Hier:
`A. (data-frame) + B. (Variablen) + C. (Art der Abbildung)`

Die oben genannten Methoden `geom_boxplot()`, `geom_bar()`, `geom_point()` usw. sind Arten der Abbildung.

Was in dieser Form noch abschreckend wirken mag, wird durch konkrete Anwendungen in den folgenden Beispielen schnell deutlicher.

##3. `geom_boxplot()`: y = numerisch, x = kategorial
```{r}
head(asp)
```
Inwiefern wird die Aspirationsdauer (d) von der Artikualtionsstelle (Kons) beeinflusst?

* y: d    (numerisch)
* x: Kons (kategorial)

```{r}
ggplot(asp) + 
  aes(y = d, x = Kons) + 
  geom_boxplot()
```
```{r,eval=FALSE}
# oder in getrennten Komponenten ablegen.
# A
p1 = ggplot(asp)
# B
p2 = aes(y = d, x = Kons)
# C
p3 = geom_boxplot()
# A + B + C
p1 + p2 + p3
# oder A + B + C ablegen
erg = p1 + p2 + p3
# Bild
erg
```

Weitere Informationen zum Boxplot:
Die Linie ist der **Median**;  der 'Box' ist der **interquartale Bereich**.

###Median und Interquartaler Bereich

* *Median* (oder *50% Quantil*): **Der mittlere Wert in der sortierten Reihenfolge**:

```{r}
x = c(15, 19, -1, 10, 11, 18, 90000)
median(x)

# das gleiche
quantile(x, .5)

# Nach Sortierung sieht man, dass 15 an der mittleren Stelle vorkommt.
sort(x)
```

Es gibt auch andere Bruchteile von Quantilen. Insbesondere wird von dem interquartilen Bereich Gebrauch gemacht, um die Streuung einzuschätzen:

```{r}
IQR(x)

# das Gleiche
quantile(x, .75) - quantile(x, .25)
#da
quantile(x, .75)
quantile(x, .25)
```


## 4. `geom_bar()`: y ist kategorial, x ist kategorial
```{r}
head(coronal)
```
Inwiefern wird die Artikulationsstelle (Fr) von der Region (Region) beeinflusst?

* y: Fr (kategorial)
* x: Region (kategorial)

```{r}
p1 = ggplot(coronal)
p2 = aes(fill = Fr, x = Region)
# Um Häufigkeiten darzustellen
p3 = geom_bar()
p1 + p2 + p3
# Um die Bars der Stufen von x nebeneinander zu stellen
p4 = geom_bar(position="dodge")
p1 + p2 + p4

# Um Proportionen darzustellen
p5 = geom_bar(position="fill")
p1 + p2 + p5
```
```{r,eval=FALSE}
#oder
ggplot(coronal) +
  aes(fill = Fr, x = Region) +
  geom_bar(position="fill")
```

## 5. `geom_point()`, `geom_line()`:  y ist numerisch, x ist numerisch
```{r}
head(int.df)
```
Inwiefern wird die Dauer (Dauer) von der Intensität (dB) beeinflusst?

* y: Dauer (numerisch) 
* x: dB (numerisch)

```{r,eval=FALSE}
# Nur Linie
ggplot(int.df) +  
  aes(x = dB, y = Dauer) + 
  geom_line() 
```
```{r}
#oder: der aes()-Teil kann auch direkt bei ggplot() eingegeben werden:
ggplot(int.df,aes(x = dB, y = Dauer)) +  
  geom_line() 
# Nur Punkte
ggplot(int.df, aes(x = dB, y = Dauer)) + 
  geom_point() 
# Beide
ggplot(int.df, aes(x = dB, y = Dauer)) + 
  geom_line() + 
  geom_point()
```

##6. Achsenbeschriftung: `+ xlab()` `+ ylab()` `+ ggtitle()`
```{r}
# Früherer Boxplot-Befehl
p1 = ggplot(asp) + 
  aes(y = d, x = Kons) + 
  geom_boxplot()
# Etikettierung für die x-Achse
p2 = xlab("Artikulationsstelle")
# Etikettierung für die y-Achse
p3 = ylab("Dauer (ms)")
# Titel
p4 = ggtitle("Boxplot-Daten")
p1 + p2 + p3 + p4

# Früherer Barchart-Befehl
bar.p = ggplot(coronal) + 
  aes(x = Region, fill = Fr) + 
  geom_bar(position = "fill")
x.p = xlab("Region")
y.p = ylab("Proportion")
t.p = ggtitle("Proportionale Aufteilung von Frikativen")
bar.p + x.p + y.p + t.p
```

## 7. Bereiche: `+coord_cartesian(xlim=c(,),ylim=c(,))`

```{r}
# Früherer geom_bar() Befehl
p1 = ggplot(int.df, aes(dB, Dauer)) + geom_point() 
# xlim und ylim
p2 = coord_cartesian(xlim=c(10,60),ylim=c(30,280))
p1 + p2
```

Vorsicht: man könnte hier auch einfach `+xlim(10,60) + ylim(30,280)` schreiben, aber auf diese Weise werden die nicht-geplotteten Daten einfach ignoriert, was problematisch ist, wenn man Funktionen auf die Daten anwenden will, z.B. Regressionslinien überlagern (siehe Vorlesung Ende Mai);
siehe z.B.: https://i.stack.imgur.com/ciyvf.png

## 8. Farben
Farbenauswahl: http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf, auch:
```{r,eval=FALSE}
colors()
```

#### `geom_boxplot()`
```{r}
########## Der vorige Befehl
ggplot(asp) + 
  aes(y = d, x = Kons) + 
  geom_boxplot()
# Default-Farben
# Jeder Box mit unterschiedlichen Farben gefüllt
ggplot(asp) + 
  aes(y = d, x = Kons, fill = Kons) + 
  geom_boxplot()
# Jeder Box mit verschiedenen Umrissfarben
ggplot(asp) + 
  aes(y = d, x = Kons, col = Kons) + 
  geom_boxplot()

# Eigene Farben wählen
farben = c("green", "red")
# gefüllt
ggplot(asp) + aes(y = d, x = Kons) + geom_boxplot(fill = farben)
# Umriss
ggplot(asp) + aes(y = d, x = Kons) + geom_boxplot(col = farben)
```

Merke: 

* `col`=Umrissfarbe
* `fill`=Füllungsfarbe

#### `geom_bar()`
```{r}
########## Der vorige Befehl
p1 = ggplot(coronal) + 
  aes(x = Region, fill = Fr) + 
  geom_bar()
p1
# Eigene Farben wählen
farben = c("yellow", "green")
p2 = scale_fill_manual(values = farben) 
p1 + p2
```

#### `geom_point()`, `geom_line()`

* `col`: Farbe. 
* `pch`: plotting character. 
Siehe http://www.endmemo.com/program/R/pchsymbols.php
* `cex`: character expansion: `cex = 2` bedeutet zwei Mal die übliche Größe
* `lwd`: Linienstärke

```{r}
########## Der vorige Befehl
ggplot(int.df, aes(x = dB, y = Dauer)) +  
  geom_point() + 
  geom_line()

#eigene Farben wählen:
ggplot(int.df, aes(x = dB, y = Dauer)) +  
  geom_point(col="purple", pch=0, cex=2) + 
  geom_line(col = "pink")
# lwd: Linienstärke
ggplot(int.df, aes(x = dB, y = Dauer)) +  
  geom_point(col="purple", pch=0, cex=2) + 
  geom_line(col = "pink", lwd=2)
```

## 9. Schriftzeichengröße
Der Default-Schriftzeichen-Größe der Achsenbeschriftung und Titel ist 11. Für die Legende etwas weniger (eventuell 10).

```{r}
p1 = ggplot(asp) + 
  aes(y = d, x = Kons) + 
  geom_boxplot() + 
  xlab("Artikulationsstelle") + 
  ylab("Dauer (ms)") + 
  ggtitle("Boxplot-Daten")
p1

# Keine Änderung
p11 = theme(text = element_text(size=11))
p1 + p11

# Schriftzeichen-Größe 16
p16 = theme(text = element_text(size=16))
p1 + p16

# Nur Achsenbeschriftung vergrößern
q24 = theme(axis.text = element_text(size=24))
p1 + q24

# Achsenbeschriftung und Bildetikettierungen unterschiedlich vergrößern
p30 = theme(text = element_text(size=30))
p1 + q24 + p30
```

## 10. Mehrere Bilder nebeneinander
```{r}
library(gridExtra)

pic1 = ggplot(asp, aes(y = d, x = Kons))  + 
  geom_boxplot()
pic2 = ggplot(coronal) + 
  aes(x = Region, fill = Fr) + 
  geom_bar()
pic3 = ggplot(int.df, aes(dB, Dauer)) + 
  geom_line() + 
  geom_point()
grid.arrange(pic1, pic2, pic3,  ncol=3, nrow =1)
```

# 11. Weitere Modifizierungen
```{r,eval=FALSE}
help(theme)
```

