
Data Science 1 - Programmieren & Visualisieren
Saskia Otto & Monika Eberhard
Universität Hamburg, IMF
Wintersemester
![]()


| Funktion | Beschreibung |
|---|---|
plot() |
Generische Funktion mit vielen Methoden (kontextabhängig) |
barplot() |
Säulen- bzw. Balkendiagramm |
boxplot() |
Boxplot |
contour() |
Plot mit Höhenlinien |
coplot() |
sog. ‘conditional plot’ |
curve() |
Kurven über einem Intervall für eine Funktion |
hist() |
Histogramm |
image() |
Erstellt kontextabhängige ‘Bildraster’ (auch in 3D) |
mosaicplot() |
Mosaikplot für kategorielle Daten |
pairs() |
Streudiagramm-Matrix für paarweise Gegenüberstellungen |
pie() |
Tortendiagramm |
qqplot() |
QQ-Plot |
?plot und ?plot.default werden viele Argumente von Grafikfunktionen genannt und erklärt.par().?par listet wesentlich mehr Argumente, die auch in den high-level Funktionen genutzt werden können.| Argument | Beschreibung |
|---|---|
| adj | Ausrichtung von Text (zentriert,…) |
| axes | Achsen sollen (nicht) eingezeichnet werden |
| bg | Hintergrundfarbe der Grafik |
| bty | Art der Box um die gezeichnete Grafik |
| cex | Größe der Schriftzeichen in der Grafik |
| col | Farben (der Linien, der Punkte, etc.) |
| las | Ausrichtung der Achsenbeschriftung |
| lty,lwd | Linientyp (gestrichelt,…) und Linienbreite |
| main,sub | Überschrift und Unterschrift |
| mfrow | mehrere Grafiken in einem Bild |
| pch | Darstellung eines Punktes |
| type | Typ der Darstellung (Linien, Punkte, Nichts) |
| xlab,ylab | x-/y-Achsenbeschriftung |
| xlim,ylim | Größe der Grafik in x-/y-Richtung |
| Funktion | Beschreibung |
|---|---|
abline() |
Zeichnet eine kontextabhängige Linie |
arrows() |
Zeichnet Pfeile |
axis() |
Zeichnet Achsen (jede Achse einzeln!) |
grid() |
Zeichnet ein Gitternetz |
legend() |
Erstellt eine Legende im Plot |
lines() |
Zeichnet schrittweise Linien |
mtext() |
Schreibt Text in den Rand (s.unten) |
points() |
Zeichnet Punkte |
polygon() |
Zeichnet ausgefüllte Polygone |
rect() |
Zeichnet (vektorwertig) ein Rechteck |
segments() |
Zeichnet (vektorwertig) Linien |
text() |
Schreibt Text in den Plot |
title() |
Beschriftet den Plot |
![]()
Screen device (default) - Fenster im Programm
![]()
File device - Ausgabeformat als Rasterdatei (JPEG, PNG, TIFF,..) oder Vektordatei (PDF, EPS)
Das Schließen mit dev.off() ist besonders wichtig, sonst werden alle folgenden Grafiken mit in dem PDF gespeichert und nicht in der Konsole angezeigt!


Weblink: https://exts.ggplot2.tidyverse.org
Mehr zum Thema ‘visual encoding’ in der Vorlesung 11 (Grundlagen der Datenvisualisierung).
Fotos von Radomil Binek, Danielle Langlois, und Frank Mayfield (von links nach rechts); Zugriff über Wikipedia (unter CC-BY-SA 3.0 Lizenz).
ggplot()![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
ggplot(
data = iris,
mapping = aes(
x = Sepal.Length,
y = Petal.Length,
colour = Species)
) +
geom_point() +
geom_smooth(method = "lm") +
scale_colour_manual(values =
c("orange","cyan3", "#68228B")) +
facet_wrap(~Species, nrow = 2) +
coord_flip() +
guides(colour = guide_none()) +
labs(x = "Länge Kelchblatt (cm)",
y = "Länge Kronblatt (cm)")Kurzform für das Ausblenden der Legende: guides(colour = "none")

![]()
ggplot(
data = iris,
mapping = aes(
x = Sepal.Length,
y = Petal.Length,
colour = Species)
) +
geom_point() +
geom_smooth(method = "lm") +
scale_colour_manual(values =
c("orange","cyan3", "#68228B")) +
facet_wrap(~Species, nrow = 2) +
coord_flip() +
guides(colour = guide_none()) +
labs(x = "Länge Kelchblatt (cm)",
y = "Länge Kronblatt (cm)") +
theme_dark()
ggsave()Das zuletzt angezeigte Diagramm wird gespeichert – hier als PDF mit 4 x 4 inch. Das Dateiformat ergibt sich aus der Endung (.pdf, .png, .jpg, …). Ohne width und height wird die Größe des aktuellen Grafikfensters übernommen.
![]()
Starte mit dieser Funktion und übergebe einen Datensatz an die Funktion: ggplot(data)

Als nächstes müssen die Datenvariablen den Koordinaten zugeordnet werden, damit ein leeres Koordinatensystem dargestellt wird. Dies geschieht in der aes() Funktion. Weitere visuelle Eigenschaften (sog. aesthetics) sind z.B. Größe, Farbe, Form, etc.
ggplot() gilt für alle Ebenen.geom_XXX() Funktion gilt nur für diese Ebene.
geom_XXX(): Kombiniere ein geometrisches Objekt/Grundelement, welches die Daten repräsentiert, mit den Abbildungseigenschaften, einer Statistik und einer Positionsanpassung, z.B. geom_point() oder geom_col().
Sog. ‘scale’ Funktionen bestimmen, wie Datenwerte in visuelle Eigenschaften übersetzt werden (überschreiben die Standardeinstellungen), wie z.B. scale_fill_manual().
facet_XXX() Funktionen erstellen kleinere Diagramme, die verschiedene Teilmengen der Daten anzeigen; nützlich zur Untersuchung von Interaktionen mit kategorialen Variablen.
Funktionen wie coord_flip() bestimmen die Darstellung des XY-Koordinatensystems und somit die Positionierung der Daten.
Mit der guides() Funktion und weiteren guide_XXX() Helferfunktionen kann die Anzeige der Achsen und Legende bestimmt werden.
Sog. ‘theme’ Funktionen bestimmen die Anzeige aller Nicht-Datenelemente des Plots. Es können alle Einstellungen mit einem kompletten Thema wie theme_classic() überschrieben oder einzelne Einstellungen mit theme() verändert werden.
Das aktuell angezeigte ggplot Diagramm lässt sich mit ggsave() speichern: ggsave("plot.png", width = 5, height = 5) → speichert den Plot als PNG mit 5 x 5 inch ab (das Format ergibt sich aus der Dateiendung).
![]()
| Diagrammtyp | geom-Funktion | Typische Fragestellung |
|---|---|---|
| Histogramm | geom_histogram() |
Wie ist eine metrische Variable verteilt? |
| Säulendiagramm | geom_bar() / geom_col() |
Wie viele Beobachtungen pro Gruppe? / Wie groß ist ein Wert pro Gruppe? |
| Boxplot | geom_boxplot() |
Wie unterscheiden sich Verteilungen zwischen Gruppen? |
| Streudiagramm | geom_point() |
Gibt es eine Beziehung zwischen zwei metrischen Variablen? |
Aus den Calc-Übungen und der VL zur deskriptiven Statistik kennen Sie bereits diese 4 Diagrammtypen → das Grundgerüst ist immer gleich: ggplot(Daten, aes(...)) + geom_XXX(). Nur die geom-Funktion und das Mapping ändern sich!
geom_histogram()Nur eine metrische Variable auf der x-Achse – die Häufigkeiten (y) berechnet ggplot2 selbst:

→ Mit binwidth (Klassenbreite) oder bins (Anzahl Klassen) legen Sie die Einteilung fest. Probieren Sie verschiedene Werte aus, die Form der Verteilung kann sich deutlich ändern!
geom_bar() - ggplot2 zählt selbstNur x angeben, die Höhe = Anzahl der Zeilen pro Kategorie:
x (Species) ist hier bereits kategorial (nominal):
x (Petal.Width) in Klassen (ordinal) umwandeln:
geom_col() - Werte liegen schon vorx und y angeben, z.B. nach einer Aggregation mit dplyr:
geom_col() - Werte liegen schon vorx und y angeben, z.B. nach einer Aggregation mit dplyr:
Mittelwerte immer mit Fehlerbalken zeigen! Und angeben, welches Maß sie darstellen: SD (Streuung der Daten), SE (Genauigkeit des Mittelwerts: sd(x) / sqrt(n())) oder 95 %-KI.
geom_boxplot()Eine kategoriale Variable (x) und eine metrische Variable (y) – für den Vergleich von Verteilungen zwischen Gruppen:
→ Zur Erinnerung: Die Box umfasst die mittleren 50% der Werte (1. bis 3. Quartil), der Strich in der Box ist der Median, Punkte außerhalb der ‘Whisker’ sind potenzielle Ausreißer.
geom_point()Zwei metrische Variablen – für die Untersuchung von Beziehungen:
→ Mit geom_smooth() wird eine Glättungskurve hinzugefügt, mit geom_smooth(method = "lm") eine Regressionsgerade.
Es gibt noch viele weitere Diagrammtypen und geom-Funktionen. Dieser Entscheidungsbaum hilft bei der Wahl – wie man ihn nutzt und welche Diagramme für welche Fragestellung geeignet sind, besprechen wir in der VL zu den Grundlagen der Datenvisualisierung.
Den Flowchart finden Sie als PDF auf der DSB-Webseite Ressourcen > Cheatsheets und auf Moodle.
![]()
![]()


Was haben wir gerade gelernt?
# ------------------------------ Vorbereitung ----------------------------------
#### Laden von Paketen
library(tidyverse)
# library(readODS)
# library(readxl)
library(DSBtools)
options(DSBtools.language = "de") # Ausgabe auf Deutsch
#### Eigene Funktionen
# -------------------- Import und Datenaufbereitung ----------------------------
#### Import einer Textdatei im CSV-Format (das gängigste Format)
kabeljau_csv <- read.csv(file = "data/Wachstum-Futter.csv")
str(kabeljau_csv) # --> Output ist ein data frame
#### Import von Calc- und Excel-Dateien (ODS- und XLSX-Format)
# Import einer ODS-Datei mit dem 'readODS' Paket
kabeljau <- readODS::read_ods("data/DS1_W03_Streudiagramm_Kabeljau.ods",
sheet = "Daten_Visualisierung")
str(kabeljau) # --> Output ist ein Tibble
# Import einer XLSX-Datei mit z.B. dem 'readxl' Paket
kabeljau_xlsx <- readxl::read_excel("data/DS1_W03_Streudiagramm_Kabeljau.xlsx",
sheet = "Daten_Visualisierung")
str(kabeljau_xlsx) # --> Output ist ein Tibble
#### Datensichtung und -transformation
# Anpassen der Spaltennamen
names(kabeljau) <- c("verzehr", "wachstum")
str(kabeljau)
# Wertebereich prüfen
summary(kabeljau)
# Beziehung explorieren: Ist sie linear? Gibt es Ausreisser?
explore_var(x = kabeljau$verzehr, y = kabeljau$wachstum,
xlab = "Verzehr/Konsum (J/g/Tag)", ylab = "Wachstum (J/g/Tag)")
# ---------------------- Lineare Regression: Berechnung ------------------------
# (-> Lektion L03 in DSB-02-Datenexploration mit R)
#### Manuelle Berechnung
# Um Tipparbeit zu sparen, speichern wir die Spalten als einzelne Vektoren
x <- kabeljau$verzehr
y <- kabeljau$wachstum
# Steigungsparameter b berechnen
b <- cov(x = x, y = y)/ var(x) # der shortcut mit der Kovarianz und Varianz
b
# Achsenabschnitt a berechnen
a <- mean(y) - b*mean(x)
a
# Das Bestimmtheitsmass R^2 berechnen
y_pred <- a + b*x # die vorhergesagten Werte
ss_gesamt <- sum( (y - mean(y))^2 ) # Summenquadrate Gesamt
ss_regression <- sum( (y_pred - mean(y))^2 ) # Summenquadrate der Regression
R2 <- round(ss_regression/ss_gesamt, 4)
R2
##### Zum Vergleich die Regression automatisch berechnen mit lm()
# Erstellung des Modells
mod <- lm(formula = wachstum ~ verzehr, data = kabeljau)
mod
# Ausgabe nur der beiden Koeffizienten
coef(mod)
# Ausgabe aller wichtigen Statistiken des Modells, inklusive von R^2
# (mehr dazu in Data Science 2)
summary(mod)
# ------------------- Lineare Regression: Visualisierung ----------------------
#### Visualisierung mit den Basisfunktionen (-> Lektion L02 und L03 in DSB-02)
# Sog. high-level Funktion plot()
plot(x = kabeljau$verzehr, y = kabeljau$wachstum,
pch = 15, cex = 1.2, col = "#004586",
xlab = "Verzehr/Konsum (J/g/Tag)", ylab = "Wachstum (J/g/Tag)")
# Sog. low-level Funktionen, die Elemente in den angezeigten Plot einfügen
abline(a = a, b = b)
title(
main = paste0("wachstum = ", round(a, 3), " + ", round(b, 3), "*verzehr"),
sub = paste0("Bestimmtheitsmaß R^2 = ", R2)
) # (paste0() verkettet Zeichen miteinander)
#### Visualisierung mit ggplot2 (-> siehe swirl-Kurs DSB-04)
kabeljau |>
ggplot(aes(x = verzehr, y = wachstum)) + # initiert Plot
geom_point(colour = "#004586", shape = 15, size = 3) +
# Punktelemente hinzufügen
geom_abline(slope = b, intercept = a) +
# Achsenbeschriftung anpassen und Titel hinzufügen
labs(x = "Verzehr/Konsum (J/g/Tag)", y = "Wachstum (J/g/Tag)",
title = str_c("wachstum = ", round(a, 3), " + ", round(b, 3), "*verzehr"),
subtitle = str_c("Bestimmtheitsmaß R^2 = ", R2)) +
# das Layout anpassen
theme_bw()DS1_W04_Demo_LineareRegression_Kabeljau.R

Was haben wir gerade gelernt?
# ------------------------------ Vorbereitung ----------------------------------
#### Laden von Paketen
library(tidyverse) # laedt 9 Pakete
# # (das gleiche wie alle Pakete einzeln zu laden)
# library(dplyr)
# library(forcats)
# library(ggplot2)
# library(lubridate)
# library(purrr)
# library(readr)
# library(stringr)
# library(tibble)
# library(tidyr)
library(DSBtools)
options(DSBtools.language = "de") # Ausgabe auf Deutsch
#### Eigene Funktionen
# Variantionskoeffizient
cv <- function(x) {
sd(x)/mean(x)
}
# -------------------- Import und Datenaufbereitung ----------------------------
#### Import von CSV-Dateien
# (-> Swirl-Lektion L01 in DSB-03-Datenaufbereitung oder per Anleitung durchs Tidyversum)
# Import der ODS-Datei, welche in den Zeilen 66-68 noch Text enthaelt
iris <- readODS::read_ods("data/DS1_W03_Saeulendiagramm_mit_iris.ods")
#### Prüfung des Imports und Datensichtung
# (-> Swirl-Lektion L02 in DSB-03)
# Prüfung des Datentyps --> IMMER DIREKT NACH DEM IMPORT VERWENDEN!
str(iris) # str = structure
# Betrachtung des Inhalts
iris
# View(iris)
# Korrektur des Datentyps und der Zeilen
iris <- iris[1:60, ] |>
mutate(across(Sepal.Length:Petal.Width, as.numeric)) |>
mutate(Species = as.factor(Species))
str(iris)
# Welche Werte kommen in jeder Spalte vor?
lapply(iris, unique)
### Weitere Funktionen zur Sichtung einzelner Aspekte
head(iris) # zeigt erste 6 Zeilen (Kopfzeilen)
tail(iris) # zeigt letzte 6 Zeilen (Endzeilen)
class(iris) # Identifikation der Objektklasse (Vektor, Matrix, dataframe,..)
nrow(iris) # Anzahl Zeilen
ncol(iris) # Anzahl Spalten
dim(iris) # Anzahl aller Dimensionen
names(iris) # Spaltennamen
typeof(iris$Sepal.Length) # Datentyp von Spalte 'Sepal.Length'
typeof(iris$Species) # Datentyp von Spalte 'Species'
# ----------------------- Deskriptive Statistik --------------------------------
#### Berechnung mehrerer Statistiken für jede Spalte im data frame
# Klassische Zusammenfassung mit base R (Ausgabe nur in der Konsole)
summary(iris)
# Shortcut mit DSBtools: Statistiken für jede Spalte, passend zum erkannten
# Variablentyp (z.B. Häufigkeiten bei 'Species', Mittelwert & Co. bei den
# metrischen Spalten). Das Ergebnis ist ein Objekt, mit dem Sie weiterarbeiten
# können - speichern Sie es dazu unter einem Namen:
describe_df(data = iris)
#### Berechnung versch. Statistiken der Kronblattlaenge, gruppiert nach Art
# (-> Lektion L01 in DSB-02-Datenexploration mit R)
# (-> Lektion L06-Gruppierte Aggregation in DSB-03)
iris_summary <- iris |>
group_by(Species) |>
summarise(
PL_mean = mean(Petal.Length), # Mittelwert
PL_median = median(Petal.Length), # Median
PL_var = var(Petal.Length), # Varianz
PL_sd = sd(Petal.Length), # Standardabweichung
PL_se = sd(Petal.Length)/sqrt(length(Petal.Length)), # Standardfehler
PL_cv = cv(Petal.Length) # Variationskoeffizient
) |>
# die Artnamen anpassen (hier Gattungsnamen anfügen) und als Faktor speichern
mutate(Species = factor(paste0("Iris ", Species))) |>
# nun die Reihenfolge der Faktorstufen nach PL_mean sortieren
mutate(Species = fct_reorder(.f = Species, .x = PL_mean, .desc = TRUE))
# Zusammenfassung ansehen
iris_summary
# Kontrolle mit DSBtools: Stimmen Ihre Werte? describe_var() berechnet die
# Statistiken der Variable 'x' getrennt für jede Gruppe in 'by'
# (Angaben zum 95%-Konfidenzintervall -> kommt in Data Science 2)
iris_stats <- describe_var(x = iris$Petal.Length, by = iris$Species)
iris_stats
#### Saeulendiagramm erstellen mit dem 'ggplot2' Paket
# (siehe auch swirl-Kurs DSB-04-Datenvisualisierung mit ggplot2)
iris_summary |>
ggplot(aes(x = Species, y = PL_mean)) + # initiert Plot
# die Saeulen hinzufügen
geom_col(fill = "#004586") +
# die Fehlerbalken hinzufügen
geom_errorbar((aes(ymin = PL_mean - PL_sd, ymax = PL_mean + PL_sd)),
width = 0.2) +
# Achsenbeschriftung anpassen
ylab("Kronblattlänge (in cm)") +
xlab("Schwertlilienart (Gattung Iris)") +
# das Layout anpassen
theme_bw()DS1_W04_Demo_DeskriptiveStatistik_iris.R

![]()
![]()

Alle Aufgaben der Übungswoche finden Sie im Handbuch:
![]()
Versuchen Sie einen der beiden Plots mit dem iris Datensatz in base R bzw. ‘ggplot2’ zu reproduzieren:

library(tidyverse) # oder library(ggplot2)
ggplot(iris,
aes(
x = Sepal.Length,
y = Petal.Length
)
) +
# Farbe und Form nur fuer die Punkte (lokal),
# damit geom_smooth() EINE Kurve fuer alle Daten zeichnet
geom_point(aes(color = Species, shape = Species),
size = 2) +
geom_smooth() +
scale_colour_manual(values =
c("red", "blue", "green")) +
labs(
x = "Länge Kelchblatt",
y = "Länge Kronblatt",
title = "Art-spezifische Beziehung beider Blattlängen"
) +
theme_classic()![]()
Versuchen Sie folgenden Plot mit dem iris Datensatz in base R zu reproduzieren und diesen als PDF abzuspeichern:

Cheatsheet zum ggplot2 Paket frei verfügbar unter diesem Link.
Dann testen Sie doch Ihr Wissen in folgendem Abschlussquiz und probieren Sie diese Challenges..
![]()
Bei weiteren Fragen: saskia.otto(at)uni-hamburg.de

Diese Arbeit ist lizenziert unter einer Creative Commons Attribution-ShareAlike 4.0 International License mit Ausnahme der entliehenen und mit Quellenangabe versehenen Abbildungen.
Kurswebseite: Data Science 1