diff --git a/.gitignore b/.gitignore index cb48773659925adc5cf68d7607061985737ba11c..93241594cd916f02ec3f4ed44e1070127a356da5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,10 @@ .Ruserdata .DS_Store .gitignore -algorithmwatch +analysen/* +livedaten/* +livedaten-backup/* +algorithmwatch/* ltwhe.log ltwhe_success.log ltwhe_crash.log diff --git a/R/aktualisiere_grafiken.R b/R/aktualisiere_grafiken.R index f7879aec60e77945eb8994d3734681542c9ce4b6..579072755f0f16991da22c99240cada10a48b047 100644 --- a/R/aktualisiere_grafiken.R +++ b/R/aktualisiere_grafiken.R @@ -5,6 +5,65 @@ #---- Hauptfunktionen ---- +#' aktualisiere_hessen_landesstimmen +#' +#' Grafikausgabe Landesstimmen ganz Hessen (direkt über dw-Publish) +aktualisiere_hessen_landesstimmen <- function(lhll_df = live_hessen_landesstimmen_lang_df){ + stimmbezirke <- lhll_df %>% pull(stimmbezirke) %>% first() + gezaehlt <- lhll_df %>% pull(gezaehlt) %>% first() + waehler <- lhll_df %>% pull(waehler) %>% first() + wahlberechtigt <- lhll_df %>% pull(wahlberechtigt) %>% first() + ungueltig <- lhll_df %>% pull(ungueltig) %>% first() + + hessen_df <- lhll_df %>% + mutate(plusminus = ifelse(prozent==0,"(.)", + paste0("(", + formatC(prozent-prozent_2018, + digits=1,format="f", flag="+", + big.mark = ".",decimal.mark = ","), + ")" + ))) %>% + select(partei,prozent,plusminus) + # Daten direkt hochladen + dw_data_to_chart(hessen_df,chart_id = hessen_id) + title = paste0("Hessen: Landesstimmen",ifelse(stimmbezirke == gezaehlt," - ERGEBNIS"," - TREND (bislang ausgezählte Stimmen)")) + intro = paste0("Abgegebene Stimmen: ", + formatC(waehler,format="d", + decimal.mark=",", big.mark="."), + + ", davon ungültig: ", + formatC(ungueltig / waehler * 100,format="f", + decimal.mark=",", digits = 1, big.mark="."), + "%, ", + ifelse(stimmbezirke == gezaehlt, + paste0( + "Wahlbeteiligung: ", + formatC(waehler / wahlberechtigt * 100,format="f", + decimal.mark=",", digits = 1, big.mark="."), + "%"), + ""), + + "<br><br>Zweitstimmen für die Parteien landesweit; auf Zehntel gerundet. in Klammern die Stimmanteile bei der Landtagswahl 2018, ", + "soweit vorhanden") + notes = notes_text_auszaehlung(gezaehlt, + stimmbezirke, + ts, + " Reihenfolge der Parteien wie auf dem Stimmzettel.<br><br>") + # TEST-Feature + if (TEST) { + intro = paste0("<b style='color:#dfedf8;'>TITLE ",title,"<br><br>INTRO ",intro,"</b>") + title ="*** TEST *** wk0 - FIKTIVE DATEN" + } + dw_edit_chart(chart_id = hessen_id, + title = title, + intro = intro, + annotate = notes) + dw_publish_chart(chart_id = hessen_id) +} + + + + #' aktualisiere_kreise_direkt #' @@ -14,7 +73,6 @@ #' Die Daten sind hier sehr schlicht: Spalten name, prozent #' Metadaten ergänzen aktualisiere_kreise_direkt <- function(live_kreise_direkt_lang_df, wk_v = c(1:55)) { - ausgezaehlt_df <- tibble() lkdl_df <- live_kreise_direkt_lang_df # Gehe durch die Wahlkreis-IDs und suche die passenden Wahlkreisdaten for (i in wk_v) { @@ -41,20 +99,18 @@ aktualisiere_kreise_direkt <- function(live_kreise_direkt_lang_df, wk_v = c(1:55 filter(wk == i) %>% mutate(prozent = paste0(formatC(prozent,digits=1,format="f", big.mark = ".",decimal.mark = ","), - " (", - formatC(differenz,digits=1,format="f", + "% (", + ifelse(partei %in% v2018_v, + formatC(differenz,digits=1,format="f", flag="+", big.mark = ".",decimal.mark = ","), - ")")) %>% + "?"), + ")" + ) + ) %>% select(name,partei,stimmen,prozent) write_csv(kand_df %>% head(5),paste0("livedaten/", fname, ".csv")) - if (gezaehlt == stimmbezirke) { - ausgezaehlt_df <- bind_rows(ausgezaehlt_df, - wahlkreis_df %>% - select(wk_name,partei,prozent) %>% - pivot_wider(names_from=partei,values_from=prozent)) - } # Metadaten einrichten: wahlbeteiligung_str <- paste0("Abgegebene Stimmen: ", formatC(waehler,format="d", @@ -68,14 +124,19 @@ aktualisiere_kreise_direkt <- function(live_kreise_direkt_lang_df, wk_v = c(1:55 paste0( "Wahlbeteiligung: ", formatC(waehler / wahlberechtigt * 100,format="f", - decimal.mark=",", digits = 1, big.mark="."), - "%"), + decimal.mark=",", digits = 1, big.mark=".")), ""), "<br><br>" ) kand_str <- paste0("Weitere: ", - paste0(kand_df %>% tail(nrow(.)-5) %>% - mutate(n = paste0(name,": 0,0%")) %>% pull(n), + paste0(kand_df %>% + tail(nrow(.)-5) %>% + mutate(nn = paste0(name,": ", + formatC(prozent, + format = "f", + digits=1, + decimal.mark = ",", + big.mark = "."))) %>% pull(nn), collapse = ", "),"<br><br>") title <- paste0("Wahlkreis ",wk, " - ",wk_name, @@ -84,7 +145,9 @@ aktualisiere_kreise_direkt <- function(live_kreise_direkt_lang_df, wk_v = c(1:55 " - ERGEBNIS", " - TREND (bislang ausgezählte Stimmen)")) intro <- paste0(wahlbeteiligung_str, - "Erststimmen für die Wahl des Direktkandidaten im Wahlkreis - die derzeit fünf führenden Kandidatinnen und Kandidaten") + "Erststimmen für die Wahl des Direktkandidaten im Wahlkreis - ", + "die derzeit fünf führenden Kandidatinnen und Kandidaten. ", + "Prozentzahlen auf Zehntel gerundet; in Klammern: Vergleich zu 2018") notes <- notes_text_auszaehlung(gezaehlt, stimmbezirke, ts,kand_str, @@ -152,8 +215,10 @@ aktualisiere_kreise_landesstimmen <- function(live_kreise_landesstimmen_lang_df) mutate(prozent = paste0(formatC(prozent,digits=1,format="f", big.mark = ".",decimal.mark = ","), " (", - formatC(differenz,digits=1,format="f", + ifelse(partei %in% v2018_v, + formatC(differenz,digits=1,format="f", flag="+", big.mark = ".",decimal.mark = ","), + "?"), ")")) %>% select(partei,stimmen,prozent,wk) write_csv(liste_df,paste0("livedaten/", @@ -184,8 +249,8 @@ aktualisiere_kreise_landesstimmen <- function(live_kreise_landesstimmen_lang_df) " - ERGEBNIS", " - TREND (bislang ausgezählte Stimmen)")) intro <- paste0(wahlbeteiligung_str, - "Zweitstimmen im Wahlkreis für die Parteien im neuen Landtag", - " (in Klammern: Ergebnis 2018, soweit vorhanden)") + "Zweitstimmen im Wahlkreis für die Parteien im neuen Landtag. ", + "Prozentzahlen auf Zehntel gerundet; in Klammern: Vergleich zu 2018") notes <- notes_text_auszaehlung(gezaehlt, stimmbezirke, ts, @@ -282,8 +347,9 @@ aktualisiere_gemeinden_direkt <- function(live_gemeinden_direkt_lang_df) { intro <- paste0(wahlbeteiligung_str, "Erststimmen in ", g_name, - " für die Direktkandidaten im Wahlkreis ",wk, - " (in Klammern: Ergebnis 2018, soweit vorhanden)") + " für die Direktkandidaten im Wahlkreis ",wk,". ", + "Prozentzahlen auf Zehntel gerundet; in Klammern: Vergleich zu 2018" + ) notes <- notes_text_auszaehlung(gezaehlt, stimmbezirke, ts,"in der Reihenfolge vom Stimmzettel<br><br>") @@ -380,7 +446,8 @@ aktualisiere_gemeinden_landesstimmen <- function(live_gemeinden_landesstimmen_la intro <- paste0(wahlbeteiligung_str, "Zweitstimmen in ",g_name, ", alle Wahllisten. ", - "Werte in Klammern geben die Differenz zur letzten Wahl 2018 an.") + "Prozentzahlen auf Zehntel gerundet; in Klammern: Vergleich zu 2018" + ) notes <- notes_text_auszaehlung(gezaehlt, stimmbezirke, ts,"in der Reihenfolge vom Stimmzettel<br><br>") @@ -412,64 +479,6 @@ aktualisiere_gemeinden_landesstimmen <- function(live_gemeinden_landesstimmen_la # # } -#' aktualisiere_hessen_landesstimmen -#' -#' Grafikausgabe Landesstimmen ganz Hessen (direkt über dw-Publish) -aktualisiere_hessen_landesstimmen <- function(lhll_df = live_hessen_landesstimmen_lang_df){ - stimmbezirke <- lhll_df %>% pull(stimmbezirke) %>% first() - gezaehlt <- lhll_df %>% pull(gezaehlt) %>% first() - waehler <- lhll_df %>% pull(waehler) %>% first() - wahlberechtigt <- lhll_df %>% pull(wahlberechtigt) %>% first() - ungueltig <- lhll_df %>% pull(ungueltig) %>% first() - - hessen_df <- lhll_df %>% - mutate(plusminus = ifelse(prozent==0,"(.)", - paste0("(", - formatC(prozent-prozent_2018, - digits=1,format="f", flag="+", - big.mark = ".",decimal.mark = ","), - ")" - ))) %>% - select(partei,prozent,plusminus) - # Daten direkt hochladen - dw_data_to_chart(hessen_df,chart_id = hessen_id) - title = paste0("Hessen: Landesstimmen",ifelse(stimmbezirke == gezaehlt," - ERGEBNIS"," - TREND (bislang ausgezählte Stimmen)")) - intro = paste0("Abgegebene Stimmen: ", - formatC(waehler,format="d", - decimal.mark=",", big.mark="."), - - ", davon ungültig: ", - formatC(ungueltig / waehler * 100,format="f", - decimal.mark=",", digits = 1, big.mark="."), - "%, ", - ifelse(stimmbezirke == gezaehlt, - paste0( - "Wahlbeteiligung: ", - formatC(waehler / wahlberechtigt * 100,format="f", - decimal.mark=",", digits = 1, big.mark="."), - "%"), - ""), - - "<br><br>Zweitstimmen für die Parteien landesweit; in Klammern die Stimmanteile bei der Landtagswahl 2018, ", - "soweit vorhanden") - notes = notes_text_auszaehlung(gezaehlt, - stimmbezirke, - ts, - " Reihenfolge der Parteien wie auf dem Stimmzettel.<br><br>") - # TEST-Feature - if (TEST) { - intro = paste0("<b style='color:#dfedf8;'>TITLE ",title,"<br><br>INTRO ",intro,"</b>") - title ="*** TEST *** wk0 - FIKTIVE DATEN" - } - dw_edit_chart(chart_id = hessen_id, - title = title, - intro = intro, - annotate = notes) - dw_publish_chart(chart_id = hessen_id) -} - - - #--- Grafikfunktionen ---- generiere_auszählungsbalken <- function(anz = gezaehlt,max_s = stimmbezirke_n,ts = ts) { fortschritt <- floor(anz/max_s*100) @@ -656,7 +665,8 @@ gemeinden_landesstimme_tabelle <- function() { title <- paste0(gemeinde_name, ": Landesstimmen") intro <- paste0("Zweitstimmen in ",gemeinde_name,", alle Wahllisten, in der Reihenfolge vom Wahlzettel. ", - "Werte in Klammern geben die Differenz zur letzten Wahl 2018 an.") + "Prozentzahlen auf Zehntel gerundet; in Klammern: Vergleich zu 2018" + ) # Metadaten anlegen forced_meta <- list() forced_meta[["title"]] <- title @@ -735,7 +745,8 @@ staedte_landesstimme_tabelle <- function() { intro <- paste0("Zweitstimmen in ",gemeinde_name,", alle Wahlkreise (", paste0(wk,collapse=", "),") -", " Alle Wahllisten, in der Reihenfolge vom Wahlzettel. ", - "Werte in Klammern geben die Differenz zur letzten Wahl 2018 an.") + "Prozentzahlen auf Zehntel gerundet; in Klammern: Vergleich zu 2018" + ) # Metadaten anlegen forced_meta <- list() forced_meta[["title"]] <- title @@ -819,7 +830,8 @@ gemeinden_direkt_tabelle <- function() { title <- paste0(gemeinde_name, ": Stimmen fürs Direktmandat") - intro <- paste0("Erststimmen in ",gemeinde_name," für die Wahl des Direktkandidaten des Wahlkreises ", wk) + intro <- paste0("Erststimmen in ",gemeinde_name," für die Wahl des Direktkandidaten des Wahlkreises ", wk,". ", + "Prozentzahlen auf Zehntel gerundet; in Klammern: Vergleich zu 2018") # Metadaten anlegen forced_meta <- list() forced_meta[["title"]] <- title diff --git a/R/auswertung.R b/R/auswertung.R index 36636d33eb6c347139eebdd10d467f5d8ad5a0e4..386d7d47e0383b85963ce70ffacb1d1486327a04 100644 --- a/R/auswertung.R +++ b/R/auswertung.R @@ -52,7 +52,7 @@ check = tryCatch( -ts <- ts_daten +#ts <- ts_daten # Alles live mit Tabelle und live_df <- hole_daten(stimmbezirke_url) stimmbezirke_n <- live_df %>% filter(Gebietstyp == "LD") %>% select(all_of(stimmbezirke_i)) %>% pull() @@ -107,6 +107,9 @@ gewinn_verlust_df <- gemeinden_parteien_df %>% arrange(id) write.xlsx(gewinn_verlust_df,"analysen/gewinn_verlust.xlsx", overwrite=T) +library(DatawRappr) +dw_data_to_chart(chart_id = "s4jvc", gewinn_verlust_df) +dw_publish_chart(chart_id = "s4jvc") parteien <- createWorkbook() for (p in parteien_idx_df$partei) { @@ -203,3 +206,45 @@ choro_alle_df <- gemeinden_parteien_df %>% write.xlsx(choro_alle_df,"analysen/choropleth_alle.xlsx") +# Alle DW-Grafiken +dw_c_v <- c("sa8zh", #AfD + "BFQBy", #CDU + "COpbT", #DIE LINKE + "qTsRa", #FDP + "kyHjZ", #FREIE WÄHLER + "q6YsR", #GRÜNE + "n1Z0P", #SPD, + "XUgAd") #Volatilität + + +for (dw_id in dw_c_v) { + dw_data_to_chart(chart_id = dw_id,choro_alle_df) + dw_publish_chart(chart_id = dw_id) +} + +#---- Briefwahl ---- +stimm_df <- live_df %>% + filter(Gebietstyp == "SB") %>% + mutate(briefwahl = (str_sub(Wahlbezirksnummer,1,2) %in% c("90","09","99")) | str_detect(Wahllokal,"Briefwahl")) %>% + mutate(AGS = str_sub(Gebietsschlüssel,4,9)) %>% + select(AGS, + g_name = Gebietsbezeichnung, + wahlberechtigt = Wahlberechtigte, + waehler = `Wählerinnen und Wähler`, + ungueltig_wk = `ungültige Wahlkreisstimmen`, + ungueltig_ls = `ungültige Landesstimmen`, + briefwahl) %>% + group_by(AGS) %>% + mutate(anzahl = n()) %>% + filter(!is.na(waehler)) %>% + mutate(bw = ifelse(briefwahl,waehler,0)) %>% + summarize(g_name = first(g_name), + wahlberechtigt = sum(wahlberechtigt), + waehler = sum(waehler), + briefwaehler = sum(bw), + ungueltig_wk = sum(ungueltig_wk), + ungueltig_ls = sum(ungueltig_ls)) %>% + mutate(briefwahlquote = (briefwaehler / waehler *1000) / 10) + +briefwahlquote <- (sum(stimm_df$briefwaehler) / sum(stimm_df$waehler) *1000) / 10 +write.xlsx(stimm_df,"analysen/briefwahl_nach_gemeinde.xlsx") diff --git a/R/lies_aktuellen_stand.R b/R/lies_aktuellen_stand.R index e7aaa6694a4612c8fd7e71189ac929e7b64d0891..c559275b789b5fc34274c7bb7991327799cc907a 100644 --- a/R/lies_aktuellen_stand.R +++ b/R/lies_aktuellen_stand.R @@ -145,9 +145,9 @@ forme_hessen_landesstimmen <- function(live_df){ wahlberechtigt = 6, waehler = 10, wahlbeteiligung = 12, - gueltig = 15, - ungueltig = 14, - ungueltig_prozent = 17, + gueltig = 77, + ungueltig = 76, + ungueltig_prozent = 78, all_of(spaltenindex_landesstimmen_df$idx) ) %>% mutate(wk = as.integer(str_sub(wk,1,3))) %>% @@ -156,7 +156,7 @@ forme_hessen_landesstimmen <- function(live_df){ # Parteinamen korrigieren mutate(partei = str_replace(partei," Landesstimmen",""))%>% # Prozentanteil errechnen - mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>% + mutate(prozent = ifelse (stimmen == 0,0,(stimmen/gueltig*100))) %>% left_join(frankentable_landesstimmen_lang_df %>% filter(wk == 0) %>% select(partei,prozent_2018), @@ -196,7 +196,7 @@ forme_kreise_direkt <- function(live_df) { # Parteinamen korrigieren mutate(partei = str_replace(partei," Wahlkreisstimmen",""))%>% # Prozentanteil errechnen - mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>% + mutate(prozent = ifelse (stimmen == 0,0,(stimmen/gueltig*100))) %>% # Ergänze die (Nach-)Namen der Direktkandidaten left_join(direktkandidaten_df %>% select (wk,partei,Nachname,name), by=c("wk","partei")) %>% @@ -231,9 +231,9 @@ forme_kreise_landesstimmen <- function(live_df) { wahlberechtigt = 6, waehler = 10, wahlbeteiligung = 12, - gueltig = 15, - ungueltig = 14, - ungueltig_prozent = 17, + gueltig = 77, + ungueltig = 76, + ungueltig_prozent = 78, all_of(spaltenindex_landesstimmen_df$idx) ) %>% mutate(wk = as.integer(str_sub(wk,1,3))) %>% @@ -242,7 +242,10 @@ forme_kreise_landesstimmen <- function(live_df) { # Parteinamen korrigieren mutate(partei = str_replace(partei," Landesstimmen",""))%>% # Prozentanteil errechnen - mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>% + mutate(prozent = ifelse (stimmen == 0, + 0, + (stimmen/gueltig*100)) + ) %>% # Ergänze 2018er Ergebnisse aus der "Frankentabelle" (Kombination direkte und umgerechnete WK) left_join(frankentable_landesstimmen_lang_df,by=c("wk","partei")) %>% group_by(wk) %>% @@ -293,7 +296,11 @@ forme_gemeinden_direkt <- function(live_df) { # Parteinamen extrahieren - mit V3-Partei! mutate(partei = str_replace(partei," Wahlkreisstimmen",""))%>% # Prozentanteil errechnen - mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>% + mutate(prozent = ifelse (stimmen == 0, + 0, + (stimmen/gueltig*100) + ) + ) %>% # Ergänze die (Nach-)Namen der Direktkandidaten left_join(direktkandidaten_df %>% select (wk,partei,Nachname,name), by=c("wk","partei")) %>% @@ -304,7 +311,9 @@ forme_gemeinden_direkt <- function(live_df) { select(AGS, partei, stimmen_2018, prozent_2018), by=c("AGS","partei")) %>% mutate(across(c(stimmen_2018,prozent_2018), ~ ifelse(is.na(.),0,.))) %>% - mutate(differenz = ifelse(prozent == 0,0,prozent - prozent_2018)) + mutate(differenz = ifelse(prozent == 0, + 0, + prozent - prozent_2018)) return(live_gemeinden_direkt_lang_df) # Filtere Kreise @@ -329,9 +338,9 @@ forme_gemeinden_landesstimmen <- function(live_df) { wahlberechtigt = 6, waehler = 10, wahlbeteiligung = 12, - gueltig = 15, - ungueltig = 14, - ungueltig_prozent = 17, + gueltig = 77, + ungueltig = 76, + ungueltig_prozent = 78, all_of(spaltenindex_landesstimmen_df$idx) ) %>% # Nur die Parteien von den Landeslisten @@ -350,7 +359,11 @@ forme_gemeinden_landesstimmen <- function(live_df) { # Parteinamen korrigieren mutate(partei = str_replace(partei," Landesstimmen",""))%>% # Prozentanteil errechnen - mutate(prozent = ifelse (stimmen == 0,0,stimmen/gueltig*100)) %>% + mutate(prozent = ifelse (stimmen == 0, + 0, + (stimmen/gueltig*100) + ) + ) %>% # Ergänze 2018er Ergebnisse in den Gemeinden left_join(gemeinden_landesstimmen_2018_lang_df %>% select(AGS, partei, stimmen_2018, prozent_2018), @@ -359,7 +372,9 @@ forme_gemeinden_landesstimmen <- function(live_df) { # fill(wahlberechtigte_2018:veraendert) %>% ungroup() %>% mutate(across(c(stimmen_2018,prozent_2018), ~ ifelse(is.na(.),0,.))) %>% - mutate(differenz = ifelse(prozent == 0,0,prozent - prozent_2018)) + mutate(differenz = ifelse(prozent == 0, + 0, + prozent - prozent_2018)) return(live_gemeinden_landesstimmen_lang_df) # Filtere Kreise diff --git a/R/lies_konfiguration.R b/R/lies_konfiguration.R index af515366428aacb40cd510502206e2aa7729ff62..30c4e38fe6d4e28547728a42d796f38db398e4a5 100644 --- a/R/lies_konfiguration.R +++ b/R/lies_konfiguration.R @@ -137,7 +137,7 @@ frankentable_direkt_lang_df <- frankentable_direkt_df %>% veraendert, partei, stimmen_2018) %>% - mutate(prozent_2018 = stimmen_2018 / gueltig_2018 * 100) + mutate(prozent_2018 = (stimmen_2018 / gueltig_2018 * 1000)/10) frankentable_landesstimmen_lang_df <- frankentable_landesstimmen_df %>% pivot_longer(cols=9:21, @@ -150,7 +150,7 @@ frankentable_landesstimmen_lang_df <- frankentable_landesstimmen_df %>% veraendert, partei, stimmen_2018) %>% - mutate(prozent_2018 = stimmen_2018 / gueltig_2018 * 100) + mutate(prozent_2018 = (stimmen_2018 / gueltig_2018 * 1000) /10) # Gemeinde-Ergebnisse laden @@ -218,7 +218,7 @@ gemeinden_direkt_2018_df <- direkt_2018_df %>% gemeinden_direkt_2018_lang_df <- gemeinden_direkt_2018_df %>% pivot_longer(cols=c(11:29),names_to="partei",values_to="stimmen_2018") %>% - mutate(prozent_2018 = stimmen_2018 / gueltig * 100) + mutate(prozent_2018 = (stimmen_2018 / gueltig * 1000)/10) ### Spalten 35-57: Landesstimmen landesstimmen_2018_df <- e2018_df %>% @@ -271,7 +271,7 @@ gemeinden_landesstimmen_2018_df <- landesstimmen_2018_df %>% gemeinden_landesstimmen_2018_lang_df <- gemeinden_landesstimmen_2018_df %>% pivot_longer(cols=c(11:33),names_to="partei",values_to="stimmen_2018") %>% - mutate(prozent_2018 = stimmen_2018 / gueltig * 100) + mutate(prozent_2018 = (stimmen_2018 / gueltig * 1000)/10) # Ganz Hessen? Ganz Hessen! hessen_landesstimmen_lang_df <- landesstimmen_2018_df %>% @@ -280,7 +280,7 @@ hessen_landesstimmen_lang_df <- landesstimmen_2018_df %>% pivot_longer(cols = 9:31, names_to = "partei", values_to = "stimmen") %>% - mutate(prozent = stimmen / gueltig * 100) + mutate(prozent = (stimmen / gueltig * 1000)/10) # Direktkandidaten @@ -300,4 +300,8 @@ direktkandidaten_df <- kandidaten_alle_df %>% # Kassel, Darmstadt, Frankfurt, Wiesbaden - die KF mit mehr als einem Wahlkreis # Offenbach wird als Gemeinde in einem Wahlkreis behandelt (der halt nur eine Gemeinde hat) staedte_v <- c("611000","411000","412000","414000") + +# Parteien, für die es Frankentable-Vergleichswerte gibt +v2018_v <- colnames(frankentable_direkt_df)[9:20] + \ No newline at end of file diff --git a/README.md b/README.md index 3a8ef572c7abfa1e1da6448c305ee47fc70ffdec..449f51e4eff9444800ed201c2c90fefc2a22426d 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ Die Daten müssen dafür über ein CSV angeliefert werden, das auf dem Bucket li dessen Adresse die Datawrapper-Grafik kennt, und das überschrieben wird, wenn etwas aktualisiert werden soll. Details hier: https://academy.datawrapper.de/article/60-external-data-sources +### Lösung: CSV- und JSON-Livedaten in Datawrapper + Schöner ist die zusätzliche Möglichkeit, ein JSON mit zusätzlichen Metadaten-Keys zu hinterlegen, dessen Inhalt die Datawrapper-Grafik genau so zieht wie die Daten - zum Beipsiel für einen angepassten Titel, einen Fortschrittsbalken für die ausgezählten Stimmbezirke und einen @@ -39,6 +41,32 @@ Wenn die Grafiken nicht neu veröffentlicht werden müssen, sondern man nur die CSV- und JSON-Dateien generieren und uploaden muss, ist ein Auswertungs-Zyklus in unter einer Minute erledigt - auf jeden Fall schnell genug, um die nächste Aktualisierung mitzubekommen. +### Generierung und Anpassung der Datawrapper-Grafiken + +Das Anlegen der Grafiken erfolgte automatisiert - wie auch sonst - , allerdings +habe ich es für effizienter gehalten, nicht jeden einzelnen Key anzupassen, weil Datawrapper +zum Teil ganze Serien von Parametern braucht, um richtig zu antworten. (Beispiel: +column-Parameter zum Umgang mit Datenreihen). + +Workflow war also: +- Anpassung von Muster-Datawrapper-Grafiken von Hand... +- ...ergänzt von automatisch generierten Farbtabellen für die Parteien +- Eintrag der CSV- und JSON-Datei-URLs automatisiert; Anpassung von Keys + +### Datawrapper-Grafiken für Live-Update einrichten via API + +Damit eine Grafik die externen Daten nutzt, muss man per API fünf(!) Keys eintragen - +siehe Funktion fix_dwcdn() in der Datei aktualisiere_grafiken.R: + +``` + data$`use-datawrapper-cdn`<- FALSE + data$`upload-method`= "external-data" + data$`external-data` = "<dateiname>.csv" + data$`external-metadata` = "<dateiname>.json" + + #...und wichtig: ein zusätzlicher Key auf der Ebene content + dw_edit_chart(chart_id = did, data = data, externalData = ext_path) +``` ## Drumherum ## diff --git a/analysen/choropleth_AfD.xlsx b/analysen/choropleth_AfD.xlsx index a7132661c4c91c35e3a74d15763c074508cd6a16..ff48424ddebc83ec1e4f1c94042c51776d13e2ad 100644 Binary files a/analysen/choropleth_AfD.xlsx and b/analysen/choropleth_AfD.xlsx differ diff --git a/analysen/choropleth_CDU.xlsx b/analysen/choropleth_CDU.xlsx index b56728f9c1fc1a7759d1df8bdd9854fbe99d3874..e564bf02054407cb9e42491cd6feb9e6bb86535f 100644 Binary files a/analysen/choropleth_CDU.xlsx and b/analysen/choropleth_CDU.xlsx differ diff --git a/analysen/choropleth_DIE LINKE.xlsx b/analysen/choropleth_DIE LINKE.xlsx index 8fb57098839007886a7a87ac3796b5dd38232ca2..98479ae9bc2439196fefdf8956c162e02fe567df 100644 Binary files a/analysen/choropleth_DIE LINKE.xlsx and b/analysen/choropleth_DIE LINKE.xlsx differ diff --git a/analysen/choropleth_FDP.xlsx b/analysen/choropleth_FDP.xlsx index 83546681829c6ec625fffb4b70a27e98b014fb08..4b309044e8d6ea46540025eca5b350353d5cfbb8 100644 Binary files a/analysen/choropleth_FDP.xlsx and b/analysen/choropleth_FDP.xlsx differ diff --git "a/analysen/choropleth_FREIE W\303\204HLER.xlsx" "b/analysen/choropleth_FREIE W\303\204HLER.xlsx" index 18dba41cb88dfeef3aa8f7c0756bf802b15ec45a..4d66e41589c58e7da1ba9eb344b4230642eb3d9c 100644 Binary files "a/analysen/choropleth_FREIE W\303\204HLER.xlsx" and "b/analysen/choropleth_FREIE W\303\204HLER.xlsx" differ diff --git "a/analysen/choropleth_GR\303\234NE.xlsx" "b/analysen/choropleth_GR\303\234NE.xlsx" index 4b408f7093ca0cb1b51947f47919f2661c363a49..a91dc7fc35b282fc4b264ebf5ac4a762e836b288 100644 Binary files "a/analysen/choropleth_GR\303\234NE.xlsx" and "b/analysen/choropleth_GR\303\234NE.xlsx" differ diff --git a/analysen/choropleth_SPD.xlsx b/analysen/choropleth_SPD.xlsx index b55faa2241080e014e809d8eba6f4cf53b162e0d..fd1dd204e725b24f2711f319de91b3a26a3e65b3 100644 Binary files a/analysen/choropleth_SPD.xlsx and b/analysen/choropleth_SPD.xlsx differ diff --git a/analysen/choropleth_alle.xlsx b/analysen/choropleth_alle.xlsx index ddcb529d79a3173c039a53509e94446b13505914..1da7a452005c4014a82bc562bcef953998e36dcb 100644 Binary files a/analysen/choropleth_alle.xlsx and b/analysen/choropleth_alle.xlsx differ diff --git a/analysen/gewinn_verlust.xlsx b/analysen/gewinn_verlust.xlsx index 1c73e64b169974d82cc7abfbd34b9e4f05f69a47..ecd87f3115895ff687b25c23724419e1cece940e 100644 Binary files a/analysen/gewinn_verlust.xlsx and b/analysen/gewinn_verlust.xlsx differ diff --git a/analysen/hochburgen_schwachstellen_gemeinden.xlsx b/analysen/hochburgen_schwachstellen_gemeinden.xlsx index 25ce8173792c2353a2db0ace7731774a70a6fb63..5bf75a1c45bffd6dbf5c2fe0e4206e1103feae4d 100644 Binary files a/analysen/hochburgen_schwachstellen_gemeinden.xlsx and b/analysen/hochburgen_schwachstellen_gemeinden.xlsx differ diff --git a/index/kandidaten_alle.xlsx b/index/kandidaten_alle.xlsx index bed6f80e6848b56dc195279a20cf6354685c9f02..56d5252e1c52785194924897ad03e9f6689d2b9e 100644 Binary files a/index/kandidaten_alle.xlsx and b/index/kandidaten_alle.xlsx differ diff --git a/index/spaltenindex_direkt.xlsx b/index/spaltenindex_direkt.xlsx index c62bee5e14299e486d7eba9adf466825a73c2949..0213cd6b964c0cd2d164918a6893ce13c12e8fb9 100644 Binary files a/index/spaltenindex_direkt.xlsx and b/index/spaltenindex_direkt.xlsx differ