Last active
August 16, 2018 09:03
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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