########################################################
## Open Data Kooperation: univie & Parlament ##########
## Showcase 4: Schriftliche Anfragen & Issue Ownership #
## code by Laurenz Ennser-Jedenastik & Daniel Bliem ###
### Kontakt: laurenz.ennser@univie.ac.at ###############
########################################################
# Arbeitsumgebung leeren
rm(list = ls())
# Laden der erforderlichen Pakete. Falls nicht installiert, mit 'install.packages("Name des Pakets") installieren
library(httr)
library(jsonlite)
library(RJSONIO)
library(RCurl)
library(httr2)
library(purrr)
library(tibble)
library(rjson)
library(tidyverse)
library(gridExtra)
library(flextable)
library(extrafont)
library(lubridate)
library(grid)
library(stringr)
library(scales)
# Definieren der URL für die POST-Anfrage
req <- request("https://www.parlament.gv.at/Filter/api/filter/data/101?js=eval&showAll=true")
# Senden der POST-Anfrage mit definiertem Body
t1 <-
req %>%
req_body_raw('{
"NRBR": [
"NR"
],
"GP_CODE": [
"XXVII",
"XXVI",
"XXV",
"XXIV",
"XXIII",
"XXII",
"XXI",
"XX",
"XIX"
],
"VHG": [
"J_JPR_M"
],
"DOKTYP": [
"J"
]
}
') %>%
req_perform()
# Die Antwort in einen Dataframe laden
df1 <- t1 %>% resp_body_json()
# Eine Schleife erstellen, um herunterladbare URLs aus den relativen Links der JSON-Antwort zu erhalten
nrows1 <- length(df1$rows)
vorne <- "https://www.parlament.gv.at"
hinten <- "?json=true"
all.urls <- rep(NA, nrows1)
all.num <- rep(NA, nrows1)
all.type <- rep(NA, nrows1)
all.GP <- rep(NA,nrows1)
# Definieren des Arbeitsverzeichnisses, aus dem JSON Files gezogen werden
setwd("Pfad/zu/Ihrem/Arbeitsverzeichnis")
# Iterieren durch die Reihen, um aus den Links herunterladbare URLs zu machen
for (i in 1:nrows1) {
all.urls[i] <- paste0(vorne, df1[["rows"]][[i]][[15]], hinten)
all.num[i] <- df1[["rows"]][[i]][[3]]
all.type[i] <- df1[["rows"]][[i]][[6]]
all.GP[i] <- df1[["rows"]][[i]][[1]]
download.file(all.urls[i], destfile = paste0(all.GP[i], "_", all.num[i],"_", all.type[i], ".json"))
print(i)
}
# Erstellen der leeren Variablen für den Dataframe
files.in.dir <- list.files(path = "Pfad/zu/Ihrem/Arbeitsverzeichnis")
files.in.dir <- files.in.dir[grep(".json", files.in.dir)] # Sicherstellen, dass nur JSON-Files in der Liste sind ...
df01 <- as.data.frame(rep(NA, length(files.in.dir)))
df01$name <- NA
df01$fraktion <- NA
df01$person_url <-NA
df01$person_2 <- NA
df01$person_url_2 <- NA
df01$frak_2 <- NA
df01$topic <- NA
df01$topic_2 <- NA
df01$topic_3 <- NA
df01$topic_4 <- NA
df01$topic_5 <- NA
df01$headword <- NA
df01$headword_2 <- NA
df01$headword_3 <- NA
df01$headword_4 <- NA
df01$headword_5 <- NA
df01$EuroVoc <- NA
df01$party <- NA
df01$einlangen <- NA
df01$beantwortung <- NA
df01$titel <- NA
df01$citation <- NA
df01$GP <- NA
df01$date <- NA
colnames(df01) <- c('name', 'person_url', 'party', 'topic','topic_2', 'EuroVoc', 'date_einlagen','date_beantwortung')
count.files <- length(files.in.dir)
# Funktion zur Ermittlung des Labels
get_label <- function(bubble) {
if (!is.null(bubble[["label"]])) {
return(bubble[["label"]])
} else {
return(NA)
}
}
# Iterieren durch alle Dateien im Verzeichnis
# und extrahieren relevanter Informationen für jedes Mitglied, die dann den erstellten leeren Variablen zugeordnet werden
for (i in 1:count.files) {
# Lese die JSON-Datei für jedes Mitglied ein
getfile <- fromJSON(file = files.in.dir[i])
# Ausgebens des Namens der Datei
print(files.in.dir[i])
# Extrahieren der passenden Daten der JSON-Datei für jede Variable und speichern dieser im Dataframe
df01$name[i] <- getfile[["content"]][["names"]][[1]][["name"]]
df01$fraktion[i] <- getfile[["content"]][["names"]][[1]][["frak_code"]]
df01$person_url[i] <- getfile[["content"]][["names"]][[1]][["url"]]
topics <- vector("list", length = 5)
if (!is.null(getfile[["content"]][["topics"]]) && !is.null(getfile[["content"]][["topics"]][["data"]][["bubbles"]])) {
for (j in 1:length(getfile[["content"]][["topics"]][["data"]][["bubbles"]])) {
topics[[j]] <- get_label(getfile[["content"]][["topics"]][["data"]][["bubbles"]][[j]])
}
}
headwords <- vector("list", length = 5)
if (!is.null(getfile[["content"]][["headwords"]]) && !is.null(getfile[["content"]][["headwords"]][["data"]][["bubbles"]])) {
for (j in 1:length(getfile[["content"]][["headwords"]][["data"]][["bubbles"]])) {
headwords[[j]] <- get_label(getfile[["content"]][["headwords"]][["data"]][["bubbles"]][[j]])
}
}
df01$topic[i] <- if (!is.null(topics[[1]])) topics[[1]] else NA
df01$topic_2[i] <- if (length(topics) >= 2 && !is.null(topics[[2]])) topics[[2]] else NA
df01$topic_3[i] <- if (length(topics) >= 3 && !is.null(topics[[3]])) topics[[3]] else NA
df01$topic_4[i] <- if (length(topics) >= 4 && !is.null(topics[[4]])) topics[[4]] else NA
df01$topic_5[i] <- if (length(topics) >= 5 && !is.null(topics[[5]])) topics[[5]] else NA
df01$headword[i] <- if (!is.null(headwords[[1]])) headwords[[1]] else NA
df01$headword_2[i] <- if (length(headwords) >= 2 && !is.null(headwords[[2]])) headwords[[2]] else NA
df01$headword_3[i] <- if (length(headwords) >= 3 && !is.null(headwords[[3]])) headwords[[3]] else NA
df01$headword_4[i] <- if (length(headwords) >= 4 && !is.null(headwords[[4]])) headwords[[4]] else NA
df01$headword_5[i] <- if (length(headwords) >= 5 && !is.null(headwords[[5]])) headwords[[5]] else NA
if (!is.null(getfile) && !is.null(getfile[["content"]]) && !is.null(getfile[["content"]][["eurovoc"]]) &&
!is.null(getfile[["content"]][["eurovoc"]][["data"]]) && !is.null(getfile[["content"]][["eurovoc"]][["data"]][["bubbles"]][[1]])) {
df01$EuroVoc[i] <- getfile[["content"]][["eurovoc"]][["data"]][["bubbles"]][[1]][["label"]]
} else {
df01$EuroVoc[i] <- NA
}
if(!is.null(getfile[["content"]][["stages"]][[1]][["date"]])){
df01$einlangen[i] <- getfile[["content"]][["stages"]][[1]][["date"]]
} else{
df01$einlangen[i] <- getfile[["content"]][["phase"]][[1]][["stages"]][[1]][["date"]]
}
df01$titel[i] <- getfile[["content"]][["title"]]
df01$citation[i] <- getfile[["content"]][["zitation"]]
df01$GP[i] <- getfile[["content"]][["gp_code"]]
eingebracht_an_index <- NULL
if (!is.null(getfile[["content"]][["names"]])) {
for (j in 1:length(getfile[["content"]][["names"]])){
if (!is.null(getfile[["content"]][["names"]][[j]][["funktext"]]) &&
getfile[["content"]][["names"]][[j]][["funktext"]] == "Eingebracht an") {
eingebracht_an_index <- j
break
}
}
}
if (!is.null(eingebracht_an_index)) {
if (!is.null(getfile[["content"]][["names"]][[eingebracht_an_index]][["frak_code"]])) {
df01$person_2[i] <- getfile[["content"]][["names"]][[eingebracht_an_index]][["name"]]
df01$person_url_2[i] <- getfile[["content"]][["names"]][[eingebracht_an_index]][["url"]]
df01$frak_2[i] <- getfile[["content"]][["names"]][[eingebracht_an_index]][["frak_code"]]
} else {
df01$person_2[i] <- getfile[["content"]][["names"]][[eingebracht_an_index]][["name"]]
df01$person_url_2[i] <- getfile[["content"]][["names"]][[eingebracht_an_index]][["url"]]
df01$frak_2[i] <- NA
}
} else {
df01$person_2[i] <- NA
df01$person_url_2[i] <- NA
df01$frak_2[i] <- NA
}
}
# Löschen leerer Spalten
df01 <- df01[,-c(3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)]
# Speichern des erstellten Dataframes
save(df01, file = "Ihr Dateiname.RData")
# falls Laden der Daten notwendig ist: load("Pfad/zu/Ihrer Datei.RData")
# Hinzufügen einer zusätzliche Jahresvariable, indem das Jahr aus dem "einlangen"-Datum extrahiert wird
df01$year <- format(as.Date(df01$einlangen, format = "%d.%m.%Y"), "%Y")
df01$year <- as.numeric(df01$year)
# Herausfiltern der Fraktion "A" (unabhängige Mitglieder)
df01 <- df01 %>%
filter(fraktion != "A")
# Filtern des Untersuchungszeitraums: Bis Sommerpause 2023 (10.07.)
df01 <- df01 %>%
filter(as.Date(einlangen, format = "%d.%m.%Y") <= as.Date("2023-07-10"))
### Erstellen von 4 neuen Themen aus den Schlagwörtern, die das Thema "Inneres und Recht" aufteilen, da dieses zu umfangreich ist
# Zuweisen der passenden Schlagwörtern zu den 4 neuen Kategorien (aus allen Schlagwörtern, die im Thema "Inneres und Recht" vorkommen)
assign_IuR_category <- function(headwords) {
categories <- character(length(headwords))
for (i in seq_along(headwords)) {
if (headwords[i] %in% c("Bundesgesetzblatt", "Bundesländer", "Bundespräsident:in", "Bundesregierung III. Sonstiges", "Verwaltungsorganisation", "Verwaltungsreform", "Verwaltungsverfahren", "Volksanwaltschaft", "Vereinbarungen", "Öffentlicher Dienst")) {
categories[i] <- "Amtsführung und Verwaltung"
} else if (headwords[i] %in% c("Zivilrecht", "Völkerrecht", "Vereins- und Versammlungsrecht", "Rechtsanwälte und Notare", "Rechtsbereinigung", "Rechtspflege", "Personenstandsrecht", "Vermögenssicherung", "Verfassungs- und Verwaltungsgerichtsbarkeit", "Politische Parteien", "Bundesverfassung", "Strafrecht")) {
categories[i] <- "Justiz"
} else if (headwords[i] %in% c("Zivilschutz", "Sicherheitswesen", "Opferfürsorge und Opferschutz")) {
categories[i] <- "Sicherheitswesen"
} else if (headwords[i] %in% c("Ausländer:in", "Flüchtlinge", "Grenzen", "Menschenrechte", "Staatsbürger:in", "Volksgruppen", "Pässe und Ausweise")) {
categories[i] <- "Migration"
} else {
categories[i] <- NA
}
}
return(categories)
}
# Zuweisen der Kategorien zu den neuen Topic_IuR-Variablen
num_headword_cols <- 5
for (i in 1:num_headword_cols) {
headword_col <- ifelse(i == 1, "headword", paste("headword_", i, sep = ""))
new_topic_col <- paste("topic_IuR_", i, sep = "")
df01[new_topic_col] <- sapply(df01[headword_col], assign_IuR_category)
}
## Filtern der Anfragen auf nur die Anfragen, welche an die Bundesregierung gerichtet wurden
# 1. Identifizieren durch Art des Dokuments: Anfragen, die nicht Dokumenttyp "J" haben
alle_doktyp_J <- all(substr(df01$citation, nchar(df01$citation), nchar(df01$citation)) == "J")
# Ergebnis
if (alle_doktyp_J) {
cat("Alle Doktyps sind J")
} else {
cat("Nicht alle Doktyps sind J")
}
# 2. Filtern der Anfragen, die an den Rechnungshof gerichtet sind (haben Wert NA als Rezipient:in)
df01 <- df01[!is.na(df01$person_2), ]
# Erneutes Speichern des Dataframes
save(df01, file = "Ihr Dateiname.RData")
## Erstellung eines benutzerdefinierten Themes für die Grafiken
# Laden der Schriftart Lato (stellen Sie zuerst sicher, dass die Schriftart auf dem PC installiert ist)
font_import(paths = "Pfad/zu/Ihrer/Schriftart")
loadfonts(device = "win")
# Erstellen des Themes
custom_theme <- function() {
theme_minimal() +
theme(
plot.background = element_rect(fill = "white", color = NA),
panel.grid.major = element_line(color = alpha("gray", 0.25)),
panel.grid.minor = element_line(color = "white"),
panel.border = element_blank(),
plot.title = element_text(color = "#132843", size = 18, face = "bold", family = "Lato", margin = margin(b = 5), hjust = 0),
plot.subtitle = element_text(color = "#132843", size = 14, family = "Lato", margin = margin(b = 20), hjust = 0),
axis.title.x = element_text(face = "bold", family = "Lato", size = 15, margin = margin(t = 15)),
axis.title.y = element_text(face = "bold", family = "Lato", size = 15, margin = margin(r = 15)),
axis.text = element_text(family = "Lato", size = 12),
legend.text = element_text(family = "Lato", face = "bold", size = 14),
plot.margin = margin(1.2, 0.7, 0.7, 0.7, "cm"),
plot.title.position = "plot",
plot.caption.position = "plot",
plot.caption = element_text(size = 11)
)
}
# Erneutes definieren des Arbeitsverzeichnisses
setwd("Pfad/Zu/Ihrem/Arbeitsverzeichnis")
#### Analyse 1: Welche Themen haben die meisten schriftlichen Anfragen?
# Filtern der NA-Werte aus der "topic" Variable.
df01_filtered <- df01[!is.na(df01$topic), ]
# Zusammenfassen aller Themenvariablen in einen Wert
all_topics_combined <- c(
df01_filtered$topic,
df01_filtered$topic_2,
df01_filtered$topic_3,
df01_filtered$topic_4,
df01_filtered$topic_5,
df01_filtered$topic_IuR_1,
df01_filtered$topic_IuR_2,
df01_filtered$topic_IuR_3,
df01_filtered$topic_IuR_4,
df01_filtered$topic_IuR_5
)
# Themen nach Häufigkeit sortieren
topic_counts <- table(all_topics_combined)
sorted_topics <- names(sort(topic_counts, decreasing = TRUE))
all_topics_combined <- factor(all_topics_combined, levels = rev(sorted_topics))
# NA-Werte aus dem Wert "all_topics_combined" entfernen
all_topics_combined_filtered <- na.omit(all_topics_combined)
# Inneres und Recht herausfiltern, aufgrund der erstellten 4 neuen Unterkategorien
all_topics_combined_filtered <- all_topics_combined_filtered[all_topics_combined_filtered != "Inneres und Recht"]
# In einen Dataframe umwandeln und Anzahl der Themen zählen
df01_topiccount <- data.frame(topic = all_topics_combined_filtered)
df01_topiccount <- df01_topiccount %>%
group_by(topic) %>%
mutate(count = n()) %>%
ungroup() %>%
distinct(topic, .keep_all = TRUE)
# Einen Tausendertrennpunkt hinzufügen
df01_topiccount$hjust_count <- ifelse(df01_topiccount$count >= 2000, 1.06, -0.06)
df01_topiccount$count <- comma(df01_topiccount$count, big.mark = ".")
df01_topiccount$count <- as.numeric(df01_topiccount$count)
df01_topiccount$count <- round(df01_topiccount$count, digits = 3)
# Format der y-Achse festlegen
format_y_axis <- function(y) {
ifelse(y == 0, "0", scales::number(y, accuracy = 0.001, scale = 1))
}
# Balkendiagramm erstellen
grafik01 <- ggplot(data = df01_topiccount, aes(x = topic, y = count)) +
geom_col(fill = "#132843", width = 0.8) +
geom_text(aes(label = sprintf("%.3f", count)), hjust = df01_topiccount$hjust_count, vjust = 0.4, size = 3.5,
color = ifelse(df01_topiccount$hjust_count == 1.06, "white", "black")) +
labs(x = "", y = "Häufigkeit der Themen",
title = "Häufigkeit der Themen in allen schriftlichen Anfragen",
subtitle = "Jän. 1996 – Jul. 2023",
caption = "Quelle: parlament.gv.at") +
custom_theme() +
theme(axis.text.y = element_text(margin = margin(r = 10, l = -25), hjust = 1),
legend.position = "none") +
scale_y_continuous(labels = format_y_axis) +
coord_flip()
ggsave("SC04_Grafik01.jpg", grafik01, width = 10, height = 7.5, units = "in", dpi = 300)
### Analyse 2: Was sind die 3 häufigsten Themen in Anfragen der aktuellen Parlamentsklubs seit der XXV. Gesetzgebungsperiode (2013)?
# Definition von Farben, Reihenfolge und Labels für jeden Parlamentsklub
fraktion_colors <- c("V" = "#62c3d0", "S" = "#FF0000", "F" = "#0052fb", "G" = "#69b12e", "N" = "#e3257b")
fraktion_order <- c("V", "S", "F", "G", "N")
fraktion_labels <- c("ÖVP", "SPÖ", "FPÖ", "Grüne", "NEOS")
# Filtern der gewünschten Klubs und Jahre
df01_sumtopic <- df01_filtered %>%
filter(fraktion %in% c("V", "S", "F", "G", "N")) %>%
filter(GP %in% c("XXV", "XXVI", "XXVII"))
# Alle Themen in eine einzelne Themenvariable zusammenführen
df01_sumtopic <- df01_sumtopic %>%
select(fraktion, starts_with("topic")) %>%
pivot_longer(cols = starts_with("topic"), names_to = "topic_variable", values_to = "topic") %>%
filter(!is.na(topic))
# Inneres und Recht erneut herausfiltern, da es in 4 Unterkategorien aufgespaltet wurde
df01_sumtopic <- df01_sumtopic %>%
filter(topic != "Inneres und Recht")
# Berechnung der 3 Themen mit den meisten schriftlichen Anfragen für jeden Klub, nach absoluten Zahlen und relativen Prozenten
df01_top_topics <- df01_sumtopic %>%
group_by(fraktion, topic) %>%
summarise(frequency = n()) %>%
arrange(fraktion, desc(frequency)) %>%
mutate(percentage = (frequency / sum(frequency)) * 100) %>%
group_by(fraktion) %>%
top_n(3, wt = frequency)
# Festlegen der horizontalen Adjustierung für verschiedene Längen von Wörtern und Prozentzahlen
df01_top_topics$hjust <- ifelse(df01_top_topics$topic == "Justiz", 1.2,
ifelse(df01_top_topics$topic == "Soziales", 1.1, 1.05))
# Die Grafik soll im Sinne der Lesbarkeit in zwei Teile geteilt sein, Daten dementsprechend filtern
df01_top_topics_1 <- df01_top_topics %>%
filter(fraktion %in% c("V", "S", "F"))
df01_top_topics_2 <- df01_top_topics %>%
filter(fraktion %in% c("G", "N"))
# Die Daten in die gewünschte Reihenfolge für die Grafik bringen
df01_top_topics_1$order=rep(c(3:1),3)
df01_top_topics_2$order=rep(c(3:1),2)
# Anpassen der Labels für die Teilung der Grafik
fraktion_labels_1 <- c("ÖVP", "SPÖ", "FPÖ")
fraktion_labels_2 <- c("Grüne", "NEOS")
# Die insgesamte Anzahl der Anfragen der Parlamentsklubs erhalten - für die Y-Achsenbeschriftung
fraktion_req_summary_1 <- df01_filtered %>%
filter(fraktion %in% c("V", "S", "F")) %>%
filter(GP %in% c("XXV", "XXVI", "XXVII")) %>%
group_by(fraktion) %>%
summarise(total_anfragen = format(n(), big.mark = ".")) %>%
arrange(match(fraktion, fraktion_order)) %>%
mutate(fraktion_with_reqN = paste0(fraktion_labels_1, "\nN = ", total_anfragen))
fraktion_req_summary_2 <- df01_filtered %>%
filter(fraktion %in% c("G", "N")) %>%
filter(GP %in% c("XXV", "XXVI", "XXVII")) %>%
group_by(fraktion) %>%
summarise(total_anfragen = format(n(), big.mark = ".")) %>%
arrange(match(fraktion, fraktion_order)) %>%
mutate(fraktion_with_reqN = paste0(fraktion_labels_2, "\nN = ", total_anfragen))
# Sortieren der Klubs
df01_top_topics_1$fraktion <- factor(df01_top_topics_1$fraktion, levels = rev(fraktion_order))
df01_top_topics_2$fraktion <- factor(df01_top_topics_2$fraktion, levels = rev(fraktion_order))
# Festlegen der horizontalen Adjustierung für die Prozentzahlen in der ersten Grafik
df01_top_topics_1$hjustper <- ifelse(df01_top_topics_1$percentage >= 10 & df01_top_topics_1$percentage <= 20, -0.15, -0.2)
# Erstellen der Grafiken
# 1. ÖVP, SPÖ, FPÖ
grafik02 <- ggplot(df01_top_topics_1, aes(x = percentage, y = fraktion, fill = fraktion, group = order)) +
geom_bar(stat = "identity", position = position_dodge(0.85), width = 0.6) +
geom_text(aes(label = paste0(round(percentage, 1), "%")),
position = position_dodge(width = 0.85),
vjust = 0.45, hjust = df01_top_topics_1$hjustper, size = 4) +
geom_text(aes(label = topic), position = position_dodge(width = 0.85), hjust = df01_top_topics_1$hjust, vjust = 0.5, size = 4.5,
color = ifelse(df01_top_topics_1$fraktion == "F", "white", "black")) +
labs(title = "Die drei häufigsten Themen schriftlicher Anfragen der ÖVP, SPÖ und FPÖ\nals Prozentsatz aller Anfragen des Klubs",
subtitle = "Okt. 2013 – Jul. 2023",
x = "Anteil an allen Anfragen des Klubs (%)",
y = "",
caption = "Quelle: parlament.gv.at") +
scale_fill_manual(values = fraktion_colors) +
scale_x_continuous(labels = scales::percent_format(scale = 1)) +
scale_y_discrete(labels = rev(fraktion_req_summary_1$fraktion_with_reqN)) +
custom_theme() +
theme(legend.position = "none",
plot.title = element_text(lineheight = 1.2),
axis.text.y = element_text(size = 12, face = "bold", lineheight = 1.2, hjust = 0.5)) +
coord_cartesian(clip = "off")
ggsave("SC04_Grafik02_1.jpg", grafik02, width = 10, height = 7.5, units = "in", dpi = 300)
# 2. Grüne, NEOS
grafik03 <- ggplot(df01_top_topics_2, aes(x = percentage, y = fraktion, fill = fraktion, group = order)) +
geom_bar(stat = "identity", position = position_dodge(0.7), width = 0.5) +
geom_text(aes(label = paste0(round(percentage, 1), "%")),
position = position_dodge(width = 0.7),
vjust = 0.45, hjust = -0.2, size = 4) +
geom_text(aes(label = topic), position = position_dodge(width = 0.7), hjust = df01_top_topics_2$hjust, vjust = 0.5, size = 4.5,
color = "black") +
labs(title = "Die drei häufigsten Themen schriftlicher Anfragen der Grünen und NEOS\nals Prozentsatz aller Anfragen des Klubs",
subtitle = "Okt. 2013 – Jul. 2023",
x = "Anteil an allen Anfragen des Klubs (%)",
y = "",
caption = "Quelle: parlament.gv.at") +
scale_fill_manual(values = fraktion_colors) +
scale_x_continuous(labels = scales::percent_format(scale = 1)) +
scale_y_discrete(labels = rev(fraktion_req_summary_2$fraktion_with_reqN)) +
custom_theme() +
theme(legend.position = "none",
plot.title = element_text(lineheight = 1.2),
axis.text.y = element_text(size = 12, face = "bold", lineheight = 1.2, hjust = 0.5)) +
coord_cartesian(clip = "off")
ggsave("SC04_Grafik02_2.jpg", grafik03, width = 10, height = 7.5, units = "in", dpi = 300)
### Analyse 3: Haben externe Ereignisse Einfluss auf die Häufigkeit bestimmter Themen ausgeübt?
# Daten filtern, um eine Liste aller Themen und deren Häufigkeit pro Jahr zu erhalten
df01_alltopics <- df01_filtered %>%
select(year, starts_with("topic"), starts_with("topic_IuR")) %>%
pivot_longer(
cols = starts_with("topic"),
names_to = "topic_name",
values_to = "topic_value"
) %>%
filter(!is.na(topic_value)) %>%
group_by(year, topic_name, topic_value) %>%
summarise(total_frequency = n())
# Die verschiedenen "topic" Variablen nach Jahr und Thema zusammenfassen
df01_alltopics <- df01_alltopics %>%
group_by(year, topic_value) %>%
summarise(total_frequency = sum(total_frequency))
# Das Jahr 2023 aufgrund unvollständiger Daten herausfiltern
df01_alltopics <- df01_alltopics %>%
filter(year != 2023)
# Nach bestimmten Themen filtern, um zu sehen, welche Themen durch externe Ereignisse auffällige Höhepunkte aufweisen
selected_topics_extevents <- c("Gesundheit und Ernährung", "Migration", "Wirtschaft") # Option: Anpassen an die Themen, an denen Sie interessiert sind
df01_alltopics_filtered <- df01_alltopics%>%
filter(topic_value %in% selected_topics_extevents)
# Eine benutzerdefinierte Farbcodierung erstellen
color_codes_extevents <- c("#d9652e", "#132843", "#628553")
# Die Höhepunkte definieren, die externe Ereignisse verursacht haben, und sie in einem Datenframe aufbereiten
peaks_year <- c(2007, 2015, 2020)
peak_labels <- c("Finanz- und Schuldenkrise", "Flüchtlingskrise", "Covid-19 Pandemie")
peak_topics <- c("Wirtschaft", "Migration", "Gesundheit und Ernährung")
peak_frequencies <- c(858, 729, 1420)
peaks_data <- data.frame(year = peaks_year, peak_labels = peak_labels, topic_value = peak_topics, total_frequency = peak_frequencies)
# Die Grafik mit Beschriftungen bei den Höhepunkten erstellen
grafik04 <- ggplot(df01_alltopics_filtered, aes(x = year, y = total_frequency, color = topic_value)) +
geom_line(linewidth = 1.33) +
geom_text(data = peaks_data,
aes(x = year, y = total_frequency, label = peak_labels),
hjust = 0.45, vjust = -0.7,
color = "#132843", family = "Lato", fontface = "bold", size = 5) +
geom_vline(xintercept = peaks_year, linetype = "dashed", color = "#132843", size = 0.5, alpha = 0.7) +
labs(x = "", y = "Häufigkeit des Themas in Anfragen",
title = "Anzahl ausgewählter Themen in schriftlichen Anfragen\nim Vergleich zu externen Ereignissen",
subtitle = "Jän. 1996 – Dez. 2022",
caption = "Quelle: parlament.gv.at") +
scale_color_manual(values = color_codes_extevents, name = "") +
scale_y_continuous(labels = comma_format(big.mark = ".")) +
custom_theme() +
theme(legend.position = "bottom",
axis.title.y = element_text(margin = margin(r = 10)),
plot.title = element_text(lineheight = 1.2)) +
scale_x_continuous(breaks = unique(c(peaks_year))) +
coord_cartesian(ylim = c(0, max(df01_alltopics_filtered$total_frequency) * 1.05))
ggsave("SC04_Grafik03.jpg", grafik04, width = 10, height = 7.5, units = "in", dpi = 300)