Skip to content

Instantly share code, notes, and snippets.

@holnburger
Last active August 16, 2018 09:03
Show Gist options
  • Save holnburger/7bc9f347e8d523e18b6bbbe3c96a24b7 to your computer and use it in GitHub Desktop.
Save holnburger/7bc9f347e8d523e18b6bbbe3c96a24b7 to your computer and use it in GitHub Desktop.
Animation der Wahlergebnisse der Bundestagwahlen (Zweitstimme) nach Geschlecht. Erstellt mit R und den Paketen tidyverse und gganimate.
# falls das Packet devtools und gganimate (die neue Version von github) noch nicht installiert sind
# install.packages('devtools')
# devtools::install_github('thomasp85/gganimate')
# Da wir die Werte in Prozent darstellen, wird auch das Packet scales benötigt.
# !Warnung! Sollte tidyverse oder gganimate noch nicht installiert worden sein, benötigt die Installation sehr lange.
library(gganimate)
library(tidyverse)
# Von der Seite: https://www.bundeswahlleiter.de/bundestagswahlen/2017/ergebnisse/repraesentative-wahlstatistik.html
btw_data <- read.csv2("https://www.bundeswahlleiter.de/dam/jcr/f0610db5-f84c-430e-96e1-19be7f599e60/btw17_rws_zwst-1953.csv", skip = 10) %>%
rename(Altersgruppe = Altersgruppe.etwa.von.....bis.....Jahren) %>%
filter(Altersgruppe == "Summe") %>%
mutate(Altersgruppe = "Alle") %>%
filter(Geschlecht != "Summe")
# Leider ist der Datensatz nicht im tidy-Format, also bauen wir ihn um. Außerdem passen uns die Namen der Parteien nicht ganz.
improved_data <- btw_data %>%
gather(CDU, SPD, PDS.DIE.LINKE, GRÜNE, CSU, FDP, AfD, Sonstige, key = Partei, value = Wahlergebnis) %>%
mutate(Partei = ifelse(Partei == "PDS.DIE.LINKE", "Die Linke", Partei)) %>%
mutate(Partei = ifelse(Partei == "GRÜNE", "Die Grünen", Partei)) %>%
# Wir passen die Faktor-Level an, damit sie in unserer Grafik in dieser Reihenfolge auftauchen
mutate(Partei = factor(Partei, levels = c("CDU", "SPD", "FDP", "CSU", "Die Grünen", "Die Linke", "AfD", "Sonstige"))) %>%
mutate(Geschlecht = ifelse(Geschlecht == "m", "männlich", "weiblich")) %>%
mutate(Wahlergebnis = Wahlergebnis / 100) %>%
replace_na(replace = list(Wahlergebnis = 0)) # Diesen Teil könnten wir auch weglassen. Korrekterweise würde dann nämlich kein Prozentwert angezeigt werden.
# Wir vergeben noch passende Farben für die Parteien
party_color <- c("AfD" = "#1a9fde",
"SPD" = "#e10b1f",
"CDU" = "#565656",
"CSU" = "#727272",
"Die Grünen" = "#499533",
"Die Linke" = "#bc3475",
"FDP" = "#e5d82d",
"Sonstige" = "#D3D3D3")
# Zunächst speichern wir den Plot ab, mit animate() können wir den Plot anschließend erstellen.
# Mit anim_save() können wir zum Ende den Plot abspeichern.
btw_animated <- ggplot(improved_data, aes(x = Partei, y = Wahlergebnis, fill = Partei)) +
geom_hline(yintercept = 0.05, colour = "#D3D3D3", linetype = "dashed") +
geom_bar(position = "dodge", stat = "identity") +
geom_text(aes(label = scales::percent(Wahlergebnis),
y = Wahlergebnis + 0.01),
position = position_dodge(width = 0.9), vjust = -0.5, size = 8, color = "black") +
labs(title = "Wahlergebnisse der Bundestagswahl {closest_state}",
subtitle = "Ergebnisse nach Geschlecht der WählerInnen*",
caption = "* 1994 und 1998 wurde die repräsentative Wahlstatistik durch den Gesetzgeber ausgesetzt",
x = "",
y = "") +
theme_light(base_size = 20) +
scale_y_continuous(labels = scales::percent, limits = c(0, 0.59)) + # Die limits wurden etwas erhöht, da die Schrift bei der CDU in einem Jahr über den Plot hinausragte.
guides(fill = FALSE) +
facet_grid(Geschlecht ~.) +
scale_fill_manual(values = party_color) +
transition_states(Bundestagswahl, 1, 3, wrap = FALSE) +
ease_aes('quadratic-in-out')
# Mit renderer = gifski_renderer() und device = "png" können wir eine gif-Datei erstellen.
# Mit renderer = ffmpeg_renderer() könnten wir eine mp4 erstellen.
animate(btw_animated, fps = 60, nframes = 300, width = 1280, height = 720, renderer = gifski_renderer())
anim_save("btw_animtated.gif")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment