Bibliotheken und Data-Frames laden:

# ggf.: 
install.packages('ggplot2')
install.packages('gridExtra')
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

und

# Prüfen, ob es ein Data-Frame ist:
class(asp)
## [1] "data.frame"
# die ersten paar Beobachtungen:
head(coronal)
##   Fr Region Vpn Socialclass
## 1 sh     R2  S1           W
## 2  s     R2  S2           W
## 3 sh     R1  S3           W
## 4  s     R3  S4           W
## 5  s     R2  S5           W
## 6 sh     R3  S6           W

Zugriff auf Elemente

coronal[r,s]  #Zugriff auf Reihe(n) r und Spalte(n) s

also z.B.:

coronal[2,2:4]
##   Region Vpn Socialclass
## 2     R2  S2           W

1. Numerische und kategoriale Variablen

Die Spalten können numerische und kategoriale Variablen enthalten.

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

asp$d[1:5]
## [1] 26.180 23.063 26.812 14.750 42.380
class(asp$d)
## [1] "numeric"
# oder
with(asp, class(d))
## [1] "numeric"
int.df$Dauer[1:5]
## [1] 162 120 223 131  67
class(int.df$Dauer)
## [1] "integer"

Kategoriale Variablen sind Faktoren mit Stufen:

class(coronal$Socialclass)
## [1] "factor"
# [1] "factor"

# Die Stufen davon. z.B. die ersten paar anschauen...
coronal$Socialclass[1:10]
##  [1] W W W W W W W W W W
## Levels: LM UM W
# oder
levels(coronal$Socialclass)
## [1] "LM" "UM" "W"

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()
    1. y = kategorial, x = kategorial: geom_bar()
    1. y = numerisch, x = numerisch: geom_point(), geom_line()

Siehe auch die Handbücher zu

Syntax in ggplot2:

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

head(asp)
##        d             Wort Vpn Kons Bet
## 1 26.180 Fruehlingswetter k01    t  un
## 2 23.063          Gestern k01    t  un
## 3 26.812           Montag k01    t  un
## 4 14.750            Vater k01    t  un
## 5 42.380            Tisch k01    t  be
## 6 21.560           Mutter k01    t  un

Inwiefern wird die Aspirationsdauer (d) von der Artikualtionsstelle (Kons) beeinflusst?

ggplot(asp) + 
  aes(y = d, x = Kons) + 
  geom_boxplot()

# 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:
x = c(15, 19, -1, 10, 11, 18, 90000)
median(x)
## [1] 15
# das gleiche
quantile(x, .5)
## 50% 
##  15
# Nach Sortierung sieht man, dass 15 an der mittleren Stelle vorkommt.
sort(x)
## [1]    -1    10    11    15    18    19 90000

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

IQR(x)
## [1] 8
# das Gleiche
quantile(x, .75) - quantile(x, .25)
## 75% 
##   8
#da
quantile(x, .75)
##  75% 
## 18.5
quantile(x, .25)
##  25% 
## 10.5

4. geom_bar(): y ist kategorial, x ist kategorial

head(coronal)
##   Fr Region Vpn Socialclass
## 1 sh     R2  S1           W
## 2  s     R2  S2           W
## 3 sh     R1  S3           W
## 4  s     R3  S4           W
## 5  s     R2  S5           W
## 6 sh     R3  S6           W

Inwiefern wird die Artikulationsstelle (Fr) von der Region (Region) beeinflusst?

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

#oder
ggplot(coronal) +
  aes(fill = Fr, x = Region) +
  geom_bar(position="fill")

5. geom_point(), geom_line(): y ist numerisch, x ist numerisch

head(int.df)
##   Vpn    dB Dauer
## 1  S1 24.50   162
## 2  S2 32.54   120
## 3  S2 38.02   223
## 4  S2 28.38   131
## 5  S1 23.47    67
## 6  S2 37.82   169

Inwiefern wird die Dauer (Dauer) von der Intensität (dB) beeinflusst?

# Nur Linie
ggplot(int.df) +  
  aes(x = dB, y = Dauer) + 
  geom_line() 
#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()

# 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(,))

# 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:

colors()

geom_boxplot()

########## 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()

########## 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()

########## 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).

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

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

help(theme)