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