library(ggplot2)
library(grid)
library(gridExtra)
library(plyr)
library(dplyr)
library(ggpubr)
library(patchwork)1 Einleitung
1.1 Inhalt
Dieses Skript dokumentiert die zu Kapitel 5.2.1 – Schauer (2025) gehörenden Abbildungen:
Kapitel 5.2.1.a - Scherbenkorpus: Abb. 5-12 - Skript-Kapitel 4.
Kapitel 5.2.1.a.i - Scherbenzahl und Fundkontexte: Abb. 5-13 - Skript-Kapitel 5.
Kapitel 5.2.1.b - Diskussion: Abb. 5-14 - Skript-Kapitel 6.
Kapitel 5.2.1.b.ii - Diskussion - Zeitliche Dimension: Abb. 5-17 - Skript-Kapitel 7.
1.2 Praktische Hinweise
1.2.1 Einführende Literatur
Um mit dem bereitgestellten R-Skript arbeiten zu können, werden die wichtigsten praktischen Schritte, die für den Einstieg erforderlich sind, kurz erklärt. Dies ersetzt jedoch nicht das Studium des Programms selbst und der Inhalte der Skripte.
Siegmund (2020) wird als Grundlage in deutscher Sprache empfohlen, als Einführung in das R-Plugin Quarto seine Anleitung Siegmund (2023). Auf Englisch ist die R Quarto-Website besonders zu empfehlen.
Field, A. u. a. (2013) ist lesenswert, unterhaltsam und enthält alle relevanten Informationen für den Einstieg. Das R Core Team bietet eine regelmäßig aktualisierte Einführung an; die aktuelle Version ist hier zu finden.
1.2.2 R, R Studio und R Quarto
R, auch R Console oder RGUI, ist das „reine“ R, d. h. es arbeitet ausschließlich mit Code. RStudio hingegen verfügt über eine Benutzeroberfläche und greift auf R zu.
Dieses R-Skript wurde in RStudio in Verbindung mit Quarto erstellt – einer R-spezifischen Schreibumgebung, die die Handhabung von Code sowohl bei der Entwicklung als auch bei der Veröffentlichung erheblich vereinfacht. Quarto ermöglicht es, einzelne R-Skripte in Form von Quarto-Dateien (.qmd) zu erstellen und in verschiedene andere Formate (.html, .pdf) zu exportieren. Neben dem „reinen“ R-Code können auch zusätzliche Informationen zu den Code-Modulen bereitgestellt werden.
Quarto-Dokumente enthalten ausführbaren R-Code, d. h. sie wurden entwickelt und umfangreich getestet, um die gewünschten Berechnungen fehlerfrei durchzuführen. Werden die Quarto-Dateien in RStudio geöffnet, sind die Code-Blöcke grau hinterlegt und können automatisch ausgeführt werden. Weitere Informationen zu Quarto und Quarto-Code finden sich hier.
Um mit diesem Skript zu arbeiten, wird empfohlen, R und RStudio, sowie R Quarto zu installieren.
1.2.3 R Projekte
Um sicherzustellen, dass die Berechnungen reibungslos ablaufen, wurde das Skript in ein R-Projekt eingebettet. Die R-Projektdatei (.Rproj) befindet sich im übergeordneten Ordner der Berechnungen und kann durch Doppelklicken geöffnet werden. Der Dateipfad wird über die Position dieser Datei definiert, sodass das gesamte Projekt beliebig gespeichert werden kann – vorausgesetzt, die Daten befinden sich in den vorgegebenen Ordnern. Die einzige Voraussetzung ist, dass der unter Skript-Kapitel Kapitel 3 hinterlegte Code-Schnipsel beim ersten Arbeiten mit diesem Skript ausgeführt wird.
Ein weiterer Vorteil von R-Projekten ist, dass alle Quarto-Dateien, die beim letzten Schließen geöffnet waren, direkt beim Öffnen des Projekts wieder geladen werden – es muss also nicht manuell nach der Dateistruktur gesucht werden.
1.2.4 R Pakete
R-Pakete müssen zunächst installiert und anschließend in jeder Sitzung erneut geladen werden siehe auch Skript-Kapitel 2, um die Berechnungen auszuführen. Sie enthalten Funktionen, die für bestimmte Analysen erforderlich sind. Zum Installieren kann der folgende Code verwendet werden:
- install.packages(“Paket-Name”)
Die Pakete werden mit folgendem Befehl geladen:
- library(Paket-Name)
Eine kurze Einführung in grundlegende R-Befehle findet sich beispielsweise auch hier.
1.3 Skript & Packages
Dieses Quarto-Skript (R Quarto v. 1.5.55) (Allaire u. a. 2024) wurde mit R v. 4.4.1 (R Core Team 2024) und RStudio v. 2024.04.2 (RStudio Team 2024) erstellt. Es werden folgende R-Pakete verwendet:
- dplyr (Wickham 2023)
- ggplot2 (Wickham 2016)
- grid (R Core Team 2024)
- gridExtra (Auguie 2017)
- ggpubr (Kassambara 2023)
- patchwork (Pedersen 2024)
- plyr (Wickham 2011)
Vor Beginn der Analysen müssen sowohl alle Pakete (siehe Skript-Kapitel Kapitel 2) geladen als auch das Working Directory gesetzt werden (siehe Skript-Kapitel Kapitel 3).
Der Code ist lauffähig, d. h. er kann fehlerfrei ausgeführt werden, sofern die vorgegebene Datenstruktur beibehalten wird.
In jedem Code-Block wird der Code zur Erstellung der jeweils ersten Abbildung erläutert – nachfolgende Grafiken mit vergleichbarem Code erhalten keine eigene Beschreibung.
1.4 Gerät und Messparameter
Die Messdaten wurden mit dem Niton XL3t (Nr. 97390) des Departments für Kulturwissenschaften der Universität München im TestAllGeo-Modus ermittelt (60 Sekunden Standard, Niedrig, Hoch sowie 120 Sekunden Leicht-Modus) und mit einem 8 mm Messspot von M. Schauer durchgeführt. Die Messungen fanden von September bis Dezember 2018 sowie von September 2019 bis Juli 2020 statt. Weitere Informationen finden sich in Kapitel 6.1.1 – Schauer (2025).
2 Notwendige R Pakete
3 Working directory
knitr::opts_knit$set(root.dir = "./")4 Abb. 5-12
# Daten einlesen und filtern
data<- read.csv("../Daten//Kap_5//Grundlagen//Tab_1.csv")
data<-filter(data, .data$Scherbenzahl!= "Keine Information vorliegend")
# Spalte nummerisch definieren
data$Scherbenzahl = as.numeric(as.character(data$Scherbenzahl))
# Diagramm erstellen
ggplot(data,aes(x=Scherbenzahl))+
geom_histogram(fill="white",color="black",bins =100)+ # Manuelle Definition der Farbe der Balken
xlab("Scherbenzahl")+ ylab("Fundstellenanzahl")+ # Manuelle Achsenbeschriftung
theme_classic()+ # Klassisches Design
scale_x_continuous(breaks=seq(0,440,20),expand=c(0,0))+ # Manuelle Definition der Achsen
scale_y_continuous(breaks=seq(0,60,5),expand=c(0,0))+
theme(axis.line=element_line(colour="black",size=0.25))+ # Manuelle Formatierung von Achsen- und Legendendarstellung
theme(legend.title=element_blank(),legend.text=element_text(size=8),axis.title=element_text(size=9),axis.text=element_text(size=8,color="black"))+theme(legend.position="bottom")+theme(axis.ticks=element_line(size=0.25,colour="black"))+
geom_vline(aes(xintercept=median(Scherbenzahl)),color="red", linetype="dashed", size=0.25) # Vertikale Markierung des Medians# Export des Diagramms
ggsave("Abb.5-12.eps",path=("../Daten//Kap_5//Abbildungen"),
plot=last_plot(),device="eps",height=6,width=15.3,unit=c("cm"),dpi=1200)5 Abb. 5-13
# Daten einlesen und filtern
data<- read.csv("../Daten//Kap_5//Grundlagen//Tab_1.csv")
data<-filter(data, .data$Scherbenzahl!= "Keine Information vorliegend")
# Spalte nummerisch definieren
data$Scherbenzahl = as.numeric(as.character(data$Scherbenzahl))
# Darstellungsreihenfolge definieren
data$Fundstellenkategorie<-factor(data$Fundstellenkategorie,
levels=c("Bandkeramische Siedlung","Abri/Hoehle","Freilandfundstelle"))
# Diagramme erstellen
Diagramm1<-ggplot(data,aes(x=Scherbenzahl))+
geom_histogram(aes(fill=Fundstellenkategorie), color="black",bins = 100)+ # Manuelle Definition der Farbe der Balken
scale_fill_manual(values = c("Bandkeramische Siedlung" = "grey25",
"Abri/Hoehle" = "lightgrey","Freilandfundstelle"="white"))+
xlab("Scherbenzahl")+ylab("Fundstellenanzahl")+ # Manuelle Achsenbeschriftung
theme_classic()+ # Klassisches Design
scale_x_continuous(breaks=seq(0,440,20),expand=c(0,0))+ # Manuelle Definition der Achsen
scale_y_continuous(breaks=seq(0,60,5),expand=c(0,0))+
theme(axis.line=element_line(colour="black",size=0.25))+ # Manuelle Formatierung von Achsen- und Legendendarstellung
theme(legend.title=element_blank(),legend.text=element_text(size=8),axis.title=element_text(size=9),axis.text=element_text(size=8,color="black"))+theme(legend.position="bottom")+theme(axis.ticks=element_line(size=0.25,colour="black"))+
geom_vline(aes(xintercept=median(Scherbenzahl)),color="red",
linetype="dashed", size=0.25) # Vertikale Markierung des Medians
Diagramm2<-data%>% group_by(Fundstellenkategorie)%>%
summarize(Scherbenzahl_sum=sum(Scherbenzahl))%>% # Summerien der Scherbenanzahl pro Fundstellenkategorie
ggplot(aes(x=Fundstellenkategorie,y=Scherbenzahl_sum))+
geom_bar(stat="identity",aes(fill=Fundstellenkategorie),colour="black")+ scale_fill_manual(values = c("Bandkeramische Siedlung" = "grey25",
"Abri/Hoehle" = "lightgrey","Freilandfundstelle"="white"))+ # Manuelle Definition der Farbe der Balken
geom_text(aes(Fundstellenkategorie, Scherbenzahl_sum,label=Scherbenzahl_sum),position=position_dodge(1),vjust=-0.3,size=2.75)+ # Manuelles Hinzufügen der Zahlenwerte als Text oberhalb der Balken
theme_classic()+ # Klassisches Design
ylab("Scherbenanzahl")+ # Manuelle Definition der Achsen
theme(axis.line = element_line(colour = "black", size = 0.25),legend.title = element_blank(),legend.text = element_blank(),axis.title = element_text(size = 9),axis.text = element_text(size = 8, color = "black"),legend.position = "none",axis.ticks = element_line(size = 0.25, colour = "black"),axis.text.x = element_blank(),axis.ticks.x = element_blank()) # Manuelle Formatierung von Achsen- und Legendendarstellung
# Kombination der Diagramme
Diagramm1 + inset_element(Diagramm2, left = 0.6, bottom = 0.2, right = 0.95, top = 0.95)# Export des kombinierten Diagramms
ggsave("Abb.5-13.eps",path=("../Daten//Kap_5//Abbildungen"),
plot=last_plot(),device="eps",height=6,width=6,unit=c("cm"),dpi=1200)6 Abb. 5-14
# Daten einlesen und filtern
data<- read.csv("../Daten//Kap_5//Grundlagen//Tab_1.csv")
data<-filter(data, .data$Scherbenzahl!= "Keine Information vorliegend")
# Spalte nummerisch definieren
data$Scherbenzahl = as.numeric(as.character(data$Scherbenzahl))
# Diagramme erstellen
Diagramm1<-ggplot(data,aes(x=Scherbenzahl))+
geom_histogram(aes(fill=Fundvergesellschaftung), color="black",bins = 100)+ # Manuelle Definition der Farbe der Balken
scale_fill_manual(values = c("Bandkeramische Siedlung" = "black",
"Fundkomplex (bandkeramisches Umfeld)" = "grey65",
"Fundkomplex (isoliert)"="lightgrey","Fundkomplex (mesolithisch)"="grey94"))+
xlab("Scherbenzahl")+ylab("Fundstellenanzahl")+ # Manuelle Achsenbeschriftung
theme_classic()+ # Klassisches Design
scale_x_continuous(breaks=seq(0,440,20),expand=c(0,0))+ # Manuelle Definition der Achsen
scale_y_continuous(breaks=seq(0,60,5),expand=c(0,0))+
theme(axis.line=element_line(colour="black",size=0.25)) + # Manuelle Formatierung von Achsen- und Legendendarstellung
theme(legend.title=element_blank(),legend.text=element_text(size=8),axis.title=element_text(size=9),axis.text=element_text(size=8,color="black"))+theme(legend.position="bottom")+theme(axis.ticks=element_line(size=0.25,colour="black"))+
geom_vline(aes(xintercept=median(Scherbenzahl)),color="red",
linetype="dashed", size=0.25) # Vertikale Markierung des Medians
Diagramm2<-data%>% group_by(Fundvergesellschaftung)%>%
summarize(Scherbenzahl_sum=sum(Scherbenzahl))%>% # Summerien der Scherbenanzahl pro Fundstellenkategorie
ggplot(aes(x=Fundvergesellschaftung,y=Scherbenzahl_sum))+
geom_bar(stat="identity",aes(fill=Fundvergesellschaftung),colour="black")+scale_fill_manual(values = c("Bandkeramische Siedlung" = "black","Fundkomplex (bandkeramisches Umfeld)" = "grey65","Fundkomplex (isoliert)"="lightgrey","Fundkomplex (mesolithisch)"="grey94"))+ # Manuelle Definition der Farbe der Balken
geom_text(aes(Fundvergesellschaftung, Scherbenzahl_sum, label=Scherbenzahl_sum),position=position_dodge(1),vjust=-0.3,size=2.75)+ # Manuelles Hinzufügen der Zahlenwerte als Text oberhalb der Balken
theme_classic()+ # Klassisches Design
ylab("Scherbenanzahl")+ # Manuelle Definition der Achsen
theme(axis.line = element_line(colour = "black", size = 0.25),legend.title = element_blank(),legend.text = element_blank(),axis.title = element_text(size = 9),axis.text = element_text(size = 8, color = "black"), legend.position = "none",axis.ticks = element_line(size = 0.25, colour = "black"),axis.text.x = element_blank(),axis.ticks.x = element_blank()) # Manuelle Formatierung von Achsen- und Legendendarstellung
# Kombination der Diagramme
Diagramm1 + inset_element(Diagramm2, left = 0.6, bottom = 0.2, right = 0.95, top = 0.95)# Export des kombinierten Diagramms
ggsave("Abb.5-14.eps",path=("../Daten//Kap_5//Abbildungen"),
plot=last_plot(),device="eps",height=6,width=6,unit=c("cm"),dpi=1200)7 Abb. 5-17
Die verwendeten Zahlenwerte wurden aus Tabelle 1 extrahiert.
# Dataframe erstellen
data <- data.frame(
LBK = factor(c("LBK I", "LBK II", "LBK III", "LBK IV", "LBK V"),
levels = c("LBK I", "LBK II", "LBK III", "LBK IV", "LBK V")),
Potenziell = c(1017, 509, 799, 978, 88),
Exakt = c(617, 111, 2, 34, 1))
# Diagramm erstellen
p <- ggplot(data, aes(x = LBK)) +
geom_line(aes(y = Potenziell, group = 1, color = "Potenziell"), size = 1) + # Hinzufügen von Verbindungslinien
geom_line(aes(y = Exakt, group = 1, color = "Exakt"), size = 1) +
scale_color_manual(values = c("Potenziell" = "black", "Exakt" = "gray50")) + # Manuelle Definition der Farbe der Linien
scale_y_continuous(limits = c(0, 1025), breaks = seq(0, 1000, 200)) + # Manuelle Definition der y-Achse
labs(y = "", x = "") + # Manuelle Definition der Achsen
theme_minimal() + # Schlichtes Design
theme(legend.position = "bottom",legend.title = element_blank(),axis.text.x = element_text(size = 10),axis.text.y = element_text(size = 10),panel.grid.minor = element_blank()) # Manuelle Formatierung von Achsen- und Legendendarstellung
# Tabelle für die Werte erstellen (mit LBK-Phasen als erste Zeile)
table_data <- rbind(c("LBK-Phase", levels(data$LBK)),
c("Scherbenanzahl (potenziell)", data$Potenziell),
c("Scherbenanzahl (exakt)", data$Exakt))
# Tabelle mit gridExtra::tableGrob formatieren
table_grob <- tableGrob(table_data, rows = NULL)
# Anpassungen für bessere Darstellung
table_grob <- gtable::gtable_add_grob(table_grob,
grobs = rectGrob(gp = gpar(fill = NA, lwd = 2)),
t = 2, b = nrow(table_grob), l = 1, r = ncol(table_grob))
# Grafik + Tabelle kombinieren
grid.arrange(p, table_grob, ncol = 1, heights = c(3, 1))# Export des Diagramms
ggsave("Abb.5-17.eps",path=("../Daten//Kap_5//Abbildungen"),
plot=last_plot(),device="eps",height=6,width=6,unit=c("cm"),dpi=1200)