Vorbemerkungen

Dieses Dokument beschreibt die Vorprozessierung und explorative Analyse des Datensatzes, der Grundlage des auf srf.ch veröffentlichten Artikel Klimafreundliche Heizungen: So gross sind die Unterschiede in den Kantonen ist.

SRF Data legt Wert darauf, dass die Datenvorprozessierung und -Analyse nachvollzogen und überprüft werden kann. SRF Data glaubt an das Prinzip offener Daten, aber auch offener und nachvollziehbarer Methoden. Zum anderen soll es Dritten ermöglicht werden, auf dieser Vorarbeit aufzubauen und damit weitere Auswertungen oder Applikationen zu generieren.

Die Vorprozessierung und Analyse wurde im Statistikprogramm R vorgenommen.

Originalquelle der Daten ist die auf Gemeindeebene aggregierte Gebäude- und Wohnungsstatistik (GWS) für die Jahre 2009-2015 (siehe Abschnitt “Originalquelle”). Für die Aggregation auf Kantonsebene wurden die jeweiligen statistischen Raumgliederungen des entsprechenden Jahres zu Hilfe genommen.

Die Endprodukte des vorliegenden Scripts, neben der vorliegenden explorativen Analyse, sind (Datenbeschreibung siehe unten):

  • energietraeger.csv: Anteil Wohngebäude mit Heizungssystemen nach Energieträger, aggregiert auf Kantonsebene, Jahr 2015.
  • klimafreundlich.csv: Anteil Wohngebäude mit klimafreundlichen Heizungssystemen und Unterschied zu 2009, aggregiert auf Kantonsebene, Jahr 2015.

R-Script & Daten

Die Vorprozessierung und Analyse wurde im Statistikprogramm R vorgenommen. Das zugrunde liegende Script sowie die prozessierten Daten können unter diesem Link heruntergeladen werden. Durch Ausführen von main.Rmd kann der hier beschriebene Prozess nachvollzogen und der für den Artikel verwendete Datensatz generiert werden. Dabei werden Daten aus dem Ordner input eingelesen und Ergebnisse in den Ordner output geschrieben.

SRF Data verwendet das rddj-template von Timo Grossenbacher als Grundlage für seine R-Scripts. Entstehen bei der Ausführung dieses Scripts Probleme, kann es helfen, die Anleitung von rddj-template zu studieren.

Debug-Informationen: This report was generated on 2018-12-07 15:39:17. R version: 3.3.3 on x86_64-pc-linux-gnu. For this report, CRAN packages as of 2017-04-12 were used.

GitHub

Der Code für die vorliegende Datenprozessierung ist auf https://github.com/srfdata/2017-05-eng-heizungen zur freien Verwendung verfügbar.

Weitere Projekte

Code & Daten von SRF Data sind unter http://srfdata.github.io verfügbar.

Haftungsausschluss

Die veröffentlichten Informationen sind sorgfältig zusammengestellt, erheben aber keinen Anspruch auf Aktualität, Vollständigkeit oder Richtigkeit. Es wird keine Haftung übernommen für Schäden, die durch die Verwendung dieses Scripts oder der daraus gezogenen Informationen entstehen. Dies gilt ebenfalls für Inhalte Dritter, die über dieses Angebot zugänglich sind.

Datenbeschreibung

energietraeger.csv

Attribut Typ Beschreibung
Jahr String
Energietraeger String Energieträger-Typ, wie in der Originalquelle angegeben, siehe unten.
Anteil Numeric Anteil Wohngebäude mit dem jeweiligen Energieträger-Typ an allen Wohngebäuden.
Kanton String

klimafreundlich.csv

Attribut Typ Beschreibung
Jahr String
Anteil_klimafreundlich String Anteil Wohngebäude mit einem klimafreundlichen* Heizungstyp, gemäss untenstehender Definition, an allen Wohngebäuden.
Unterschied Numeric Unterschied dieses Anteils zu 2009, in Prozentpunkten / 100.
Kanton String

*zu diesen zählt SRF Data Holzheizungen, thermische Solaranlagen, Wärmepumpen und der Anschluss an ein Fernwärmenetz.

Originalquelle

Originalquelle ist die auf Gemeindeebene aggregierte Gebäude- und Wohnungsstatistik (GWS) für die Jahre 2009-2015. Die aggregierten Daten wurden SRF Data vom Bundesamt für Statistik (BFS) zur Verfügung gestellt. Es handelt sich dabei um eine Excel-Datei, die auf den jeweiligen Sheets die Daten für ein Jahr enthält. Die zugrundeliegende Gebäude- und Wohnungsstatistik (GWS) ist Teil des GEOSTAT-Vertriebsmodells und dort erhältlich, allerdings nicht auf Gemeinde-, sondern auf Hektarebene.

Das BFS stellt die Rohdaten dieser Auswertung unter folgendem Hinweis der Öffentlichkeit frei zur Verfügung:

“Die Daten stammen aus dem Gebäude- und Wohnungsregister (GWR). Dessen Nachführung stützt sich auf die Meldungen der Bauämter zu den baubewilligungspflichtigen Bauvorhaben. Die Baubewilligungspflicht der Kantone und Gemeinden ist vor allem im Energiebereich sehr heterogen. Veränderungen sind deshalb mit Vorsicht zu interpretieren. Überdies wurde die Baubewilligungspflicht für Sonnenkollektoren 2014 aufgehoben, so dass die Nachführung dieses Energieträgers mit dem GWR nicht mehr sichergestellt werden kann.”

Vorbereitungen

## [1] "package package:rmarkdown detached"
## Loading required package: knitr
## Loading required package: rstudioapi

Packages definieren

# von https://mran.revolutionanalytics.com/web/packages/checkpoint/vignettes/using-checkpoint-with-knitr.html
cat("library(magrittr)
library(tidyr)
library(purrr)
library(dplyr)
library(readxl)
library(ggplot2)
library(rmarkdown)
library(scales)", 
file = "manifest.R")

Packages installieren

# if checkpoint is not yet installed, install it (for people using this
# system for the first time)
if (!require(checkpoint)) {
  if (!require(devtools)) {
    install.packages("devtools", repos = "http://cran.us.r-project.org")
    require(devtools)
  }
  devtools::install_github("RevolutionAnalytics/checkpoint",
                           ref = "v0.3.2", # could be adapted later,
                           # as of now (beginning of July 2017
                           # this is the current release on CRAN)
                           repos = "http://cran.us.r-project.org")
  require(checkpoint)
}
# nolint start
if (!dir.exists("~/.checkpoint")) {
  dir.create("~/.checkpoint")
}
# nolint end
# install packages for the specified CRAN snapshot date
checkpoint(snapshotDate = package_date,
           project = path_to_wd,
           verbose = T,
           scanForPackages = T,
           use.knitr = F,
           R.version = R_version)
rm(package_date)

Packages laden

source("manifest.R")
## 
## Attaching package: 'tidyr'
## The following object is masked from 'package:magrittr':
## 
##     extract
## 
## Attaching package: 'purrr'
## The following object is masked from 'package:magrittr':
## 
##     set_names
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:purrr':
## 
##     contains, order_by
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
unlink("manifest.R")

ggplot2 Themes definieren

theme_srf <- function(base_size = 10, base_family = "SRG SSR Type", ...) {
  theme_bw() +
    theme(
      title = element_text(size = 16, family = base_family, face = "bold"), 
      text = element_text(color = "#555555", family = base_family),
      legend.text = element_text(size = 14), 
      legend.title = element_text(size = 15),
      legend.spacing = unit(0, "cm"),
      axis.line = element_blank(),
      legend.box = "vertical", 
      panel.border = element_blank(),
      plot.background = element_rect(fill = "#f5f5f2"), 
      panel.background = element_rect(fill = "#f5f5f2"), 
      legend.background = element_rect(fill = "#f5f5f2"),  
      legend.key = element_blank(),
      legend.key.width = unit(c(0.7), units = "cm"),
      legend.key.height = unit(c(0.5), units = "cm"),
      panel.grid.minor = element_blank(),
      panel.grid.major = element_blank(),
      panel.spacing = unit(c(0.4), units = "mm"),
      plot.margin = unit(c(0.9,0.9,0.9,0.9), "cm"),
      axis.title.y = element_text(size = 16, vjust = 2),
      axis.title.x = element_text(size = 16, vjust = -1),
      axis.text.y = element_text(size = 13),
      axis.text.x = element_text(size = 13),
      complete = TRUE,
      ...
    )
}

theme_srf_map <- function(...) {
  theme_srf() +
  theme(
    axis.line = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    legend.text = element_text(size = 10), 
    legend.title = element_text(size = 11),
    legend.key.width = unit(c(0.5), units = "cm"),
    legend.key.height = unit(c(0.3), units = "cm"),
    legend.margin = unit(0, "cm"),
    plot.margin = unit(c(0.5,0.1,0.1,0.1), "cm"),
    panel.grid.minor = element_line(color = "grey90", size = 0.2),
    complete = T,
    ...
  )
}

theme_map <- function(...) {
  theme_minimal() +
  theme(
    text = element_text(family = "SRG SSR Type", color = "#22211d"),
    axis.line = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    # panel.grid.minor = element_line(color = "#ebebe5", size = 0.2),
    panel.grid.major = element_line(color = "#ebebe5", size = 0.2),
    panel.grid.minor = element_blank(),
    plot.background = element_rect(fill = "#f5f5f2", color = NA), 
    panel.background = element_rect(fill = "#f5f5f2", color = NA), 
    legend.background = element_rect(fill = "#f5f5f2", color = NA),
    panel.border = element_blank(),
    ...
  )
}
sources <- function(text = "SRF Data", vpos = "top"){
  g = grobTree(textGrob(paste("Quelle:", text), x = ifelse(vpos == "top", 0.5, 0.955), y = ifelse(vpos == "top", 0.98, 0.08), just = ifelse(vpos == "top", "centre", "right"), vjust = ifelse(vpos == "top", "top", "bottom"), gp = gpar(fontfamily = "SRG SSR Type", col = "#555555", fontsize = 14)))
  annotation_custom(g)
}

Vorprozessierung

Datensätze einlesen

gebäude <- list()
gebäude_kantone <- list()
rgs <- list()

# wieviele Zeilen sollen in den Excel-Dateien jeweils übersprungen werden? 
gebäude_skiplines <- c(12, 15, 15, 13, 15, 15, 15)
rgs_skiplines <- rev(c(rep(22,5), rep(16,2)))

# Funktion, um output von read_excel zu unterdrücken
quiet_read_excel <- quietly(read_excel)
k <- c(2015:2009)
for(i in 1:7){
  # Gebäude
  # Anzahl GMDE in 2015: 2324
  # Anzahl GMDE in 2014: 2352
  # Anzahl GMDE in 2013: 2396
  # Anzahl GMDE in 2012: 2485
  # Anzahl GMDE in 2011: 2515
  # Anzahl GMDE in 2010: 2584
  # Anzahl GMDE in 2009: 2624
  sentinel <- ""
  if(i == 4){
    sentinel <- "."
  }
  gebäude[[i]] <- quiet_read_excel("input/GDE_GEB_HEIZ_2009-2015_20170419.xls", sheet = (i + 1), 
                               col_names = F,
                               skip = gebäude_skiplines[i],
                             na = sentinel)$result %>% rename(
                                 `BFS_NR` = X1,
                                 `Gemeindename` = X2,
                                 `total` = X3,
                                 `Einzelofenheizung` = X4,
                                 `Etagenheizung` = X5,
                                 `Zentralheizung` = X6,
                                 `Zentralheizung_mehrere` = X7, 
                                 `Öffentliche Fernwärme` = X8, 
                                 `Andere Heizungsart` = X9,
                                 `Keine Heizung` = X10, 
                                 `Heizöl` = X11,
                                 `Kohle` = X12,
                                 `Gas` = X13,
                                 `Elektrizität` = X14,
                                 `Holz` = X15,
                                 `Wärmepumpe` = X16,
                                 `Sonnenkollektor` = X17,
                                 `Fernwärme` = X18,
                                 `Andere_Energieträger` = X19) %>% 
    filter(!is.na(BFS_NR)) %>% 
    mutate(BFS_NR = as.numeric(BFS_NR))
  
  gebäude[[i]][is.na(gebäude[[i]])] <- 0

  gebäude[[i]]$Jahr <- k[i]

  # Raumgliederungen
  # Anzahl eingelesene RG in 2014: 2352
  # Anzahl eingelesene RG in 2013: 2408
  # Anzahl eingelesene RG in 2012: 2495
  # Anzahl eingelesene RG in 2011: 2551
  # Anzahl eingelesene RG in 2010: 2596
  # Anzahl eingelesene RG in 2009: 2636
  
  j <- 16 - i
  if(j == 9){
    j <- "09"
  }
  filenames_to_read <- paste0("input/be-b-00.04-rgs-", j, ".xls")
  rgs[[i]] <- quiet_read_excel(filenames_to_read, skip = rgs_skiplines[i] , col_names = F)$result %>% 
    select(BFS_NR = X1, KANTON = X3)
  
  gebäude_kantone[[i]] <- left_join(gebäude[[i]], rgs[[i]], by = "BFS_NR")
  # Anzahl eingelesene GMDE in 2014: 2352 -> korrekt
  # Anzahl eingelesene GMDE in 2013: 2395 -> inkorrekt, eine zu wenig
  # Anzahl eingelesene GMDE in 2012: 2484 -> inkorrekt, eine zu wenig
  # Anzahl eingelesene GMDE in 2011: 2508 -> inkorrekt, sieben zu wenig
  # Anzahl eingelesene GMDE in 2010: 2582 -> inkorrekt, zwei zu wenig
  # Anzahl eingelesene GMDE in 2009: 2622 -> inkorrekt, zwei zu wenig
  
}
# In einen Dataframe zusammenfügen
WHG_HEIZ <- do.call(rbind.data.frame, gebäude_kantone)



# Um fehlende Gemeinden zu finden, wurden "gebäude" und "rgs" oben zuerst mit einem anti_join statt mit einem 
# left_join verbunden.

# fehler <- do.call(rbind.data.frame, gebäude_kantone)
# # fehler <- fehler[complete.cases(fehler),]
# save(fehler, file = "input/fehler.RData")

# der resultierende Datensatz, der die fehlenden Gemeinden mit ihren Sachdaten enthält, wird hier der Einfachheit halber reingeladen. Diese Gemeinden haben im jeweiligen Jahr keinen zugehörigen Kanton.
load("input/fehler.RData")

# WHG_HEIZ <- WHG_HEIZ[complete.cases(WHG_HEIZ),]

# Fehler der fehlenden Kantone beheben, d.h. ihnen den korrekten Kanton zuweisen
for(bfs_id in fehler$BFS_NR) {
  WHG_HEIZ[WHG_HEIZ$BFS_NR == bfs_id,]$KANTON <- WHG_HEIZ[WHG_HEIZ$BFS_NR == bfs_id & WHG_HEIZ$Jahr == 2015,]$KANTON
}

# restrukturieren
energieträger_heizungen <- WHG_HEIZ %>%
  gather (Energieträger, Häufigkeit_Energieträger, Heizöl:Andere_Energieträger) %>%
  select(BFS_NR, Gemeindename, Kanton = KANTON, Jahr, Energieträger, Häufigkeit_Energieträger)  %>%
  mutate(Kanton = as.factor(Kanton), Jahr = as.factor(Jahr), Energieträger = as.factor(Energieträger), Energieträger_Typ = "klimafreundlich") %>% 
  arrange(Kanton)  

# aufteilen in klimafreundlich und nicht klimafreundlich
energieträger_heizungen[energieträger_heizungen$Energieträger == "Andere_Energieträger",]$Energieträger_Typ <- "andere"

energieträger_heizungen[energieträger_heizungen$Energieträger == "Elektrizität" |
                          energieträger_heizungen$Energieträger == "Gas" |
                          energieträger_heizungen$Energieträger == "Heizöl" |
                          energieträger_heizungen$Energieträger == "Kohle",]$Energieträger_Typ <- "nicht_klimafreundlich"

table(is.na(energieträger_heizungen$Energieträger_Typ))
## 
##  FALSE 
## 155520
energieträger_heizungen %<>% mutate(Energieträger_Typ = as.factor(Energieträger_Typ))

# Kantonsnamen reinholen

kantons_namen <- read.csv("input/kantone.csv", stringsAsFactors = F)

rm(WHG_HEIZ, i, j, bfs_id, filenames_to_read, gebäude, gebäude_kantone, gebäude_skiplines, rgs_skiplines, sentinel, rgs)

Aggregieren

nach_typ <- energieträger_heizungen %>% 
  group_by(Kanton, Jahr, Energieträger_Typ) %>%
  summarize(Summe_Typ = sum(Häufigkeit_Energieträger)) %>% 
  ungroup()

nach_kanton_jahr <- 
  energieträger_heizungen %>% 
  group_by(Kanton, Jahr) %>% 
  summarize(Summe_Typ_Total = sum(Häufigkeit_Energieträger))

nach_typ %<>% left_join(nach_kanton_jahr) %>% 
  mutate(Verhältnis = Summe_Typ / Summe_Typ_Total)

aenderung_prozentpunkte <- nach_typ %>% 
  filter(Energieträger_Typ == "klimafreundlich" & (Jahr == 2015 | Jahr == 2009)) %>% 
  group_by(Kanton) %>% 
  mutate(Unterschied = Verhältnis - lag(Verhältnis)) %>% 
  filter(Jahr == 2015)

prozentpunkte_plot_sortiert <- aenderung_prozentpunkte %>%
  arrange(desc(Unterschied)) %>%
  ungroup() %>%
  mutate(kantons_integer = as.integer(as.character(Kanton))) %>%
  left_join(kantons_namen, by = c("kantons_integer" = "KTNR"))

# prozentpunkte_plot <- prozentpunkte_plot_sortiert %>%
#   mutate(Kanton = factor(Kanton, labels = prozentpunkte_plot_sortiert$GDEKTNA, levels = prozentpunkte_plot_sortiert$Kanton))

Aggregieren auf CH-Ebene

nach_jahr_ch_typ <- energieträger_heizungen %>%
  group_by(Jahr, Energieträger_Typ) %>%
  summarize(Summe_Typ = sum(Häufigkeit_Energieträger)) %>%
  ungroup()

nach_jahr_ch_typ_alle <- energieträger_heizungen %>%
  group_by(Jahr, Energieträger) %>%
  summarize(Summe_Typ = sum(Häufigkeit_Energieträger)) %>%
  ungroup()

nach_jahr_ch <- energieträger_heizungen %>%
  group_by(Jahr) %>%
  summarize(Summe_Typ_Total = sum(Häufigkeit_Energieträger))


nach_jahr_ch_typ %<>% left_join(nach_jahr_ch) %>%
  mutate(Verhältnis = Summe_Typ / Summe_Typ_Total)

nach_jahr_ch_typ_alle %<>% left_join(nach_jahr_ch) %>%
  mutate(Verhältnis = Summe_Typ / Summe_Typ_Total) %>%
  filter(Jahr == 2015) %>%
  arrange(desc(Verhältnis))

nach_jahr_ch_typ[nach_jahr_ch_typ$Jahr == 2015 & nach_jahr_ch_typ$Energieträger_Typ == "klimafreundlich",]$Verhältnis - nach_jahr_ch_typ[nach_jahr_ch_typ$Jahr == 2009 & nach_jahr_ch_typ$Energieträger_Typ == "klimafreundlich",]$Verhältnis
## [1] 0.04215412

Aufschlüsselung Energieträger

nach_heizung <- energieträger_heizungen %>% 
  group_by(Kanton, Jahr, Energieträger) %>%
  summarize(Summe_Heizung = sum(Häufigkeit_Energieträger)) %>% 
  ungroup()
nach_heizung %<>% left_join(nach_kanton_jahr) %>% 
  mutate(Verhältnis = Summe_Heizung / Summe_Typ_Total)

anteil_heizung_2015 <- nach_heizung %>% filter(Jahr == 2015) 

nach_typ_kt_2015 <- nach_typ %>% 
  filter(Jahr == 2015 & Energieträger_Typ == "klimafreundlich") %>% 
  arrange(desc(Verhältnis)) %>% 
  mutate(kantons_integer = as.integer(as.character(Kanton))) %>% 
  left_join(kantons_namen, by = c("kantons_integer" = "KTNR"))

anteil_heizung_2015 %<>%   
  mutate(kantons_integer = as.integer(as.character(Kanton))) %>% 
  left_join(kantons_namen, by = c("kantons_integer" = "KTNR")) %>% 
  mutate(GDEKT = factor(GDEKT, labels = rev(nach_typ_kt_2015$GDEKT), levels = rev(nach_typ_kt_2015$GDEKT))) %>% 
  mutate(Energieträger = factor(Energieträger, levels = nach_jahr_ch_typ_alle$Energieträger))

Explorative Visualisierung

Small Multiples

nach_typ_plot <- nach_typ %>%
  filter(Energieträger_Typ == "klimafreundlich") %>%
  mutate(Jahr = as.integer(as.character(Jahr))) %>%
  mutate(Kanton = factor(Kanton, labels = kantons_namen$GDEKTNA))

p <- ggplot(nach_typ_plot, aes(x = Jahr, y = Verhältnis)) +
  geom_line() +
  facet_wrap(c("Kanton"), nrow = 13, ncol = 2) +
  ylab("Anteil klimafreundliche Heizungen") +
  scale_y_continuous(labels = percent) +
  theme_srf(
    strip.background = element_blank()
  )
p

rm(nach_typ_plot)
# ggsave(p, filename = "output/linien.png", width = 5, height = 10)

Slope Graph

aenderung_prozentpunkte_slope_graph <- nach_typ %>% 
  filter(Energieträger_Typ == "klimafreundlich" & (Jahr == 2015 | Jahr == 2009)) 

aenderung_prozentpunkte_slope_graph %<>%   
  mutate(kantons_integer = as.integer(as.character(Kanton))) %>% 
  left_join(kantons_namen, by = c("kantons_integer" = "KTNR")) %>% 
  mutate(Verhältnis_label = paste0("   ", round(Verhältnis * 100, 1), "%")) %>% 
  mutate(Kanton_label = paste0(GDEKT, " ", round(Verhältnis * 100, 1), "%   ")) %>% 
  mutate(Kanton_vjust = .5) %>% 
  mutate(Kanton_vjust = ifelse(GDEKT == "LU", 1, Kanton_vjust)) %>% 
  mutate(Kanton_vjust = ifelse(GDEKT == "SZ", 2, Kanton_vjust)) %>% 
  mutate(Kanton_vjust = ifelse(GDEKT == "BE", .8, Kanton_vjust)) %>% 
  mutate(Kanton_vjust = ifelse(GDEKT == "SG", .8, Kanton_vjust)) %>% 
  mutate(Kanton_vjust = ifelse(GDEKT == "TG", 2, Kanton_vjust)) %>% 
  mutate(Kanton_vjust = ifelse(GDEKT == "SH", 1.5, Kanton_vjust)) %>% 
  mutate(Kanton_vjust = ifelse(GDEKT == "ZG", 1, Kanton_vjust))


p <- ggplot(aenderung_prozentpunkte_slope_graph,  aes(x = Jahr, y = Verhältnis, group = Kanton)) +
  geom_line(color = "#555555") +
  geom_point(aes(x = Jahr, y = Verhältnis), size = 2, color = "#555555") + 
  geom_text(data = subset(aenderung_prozentpunkte_slope_graph, Jahr == 2009), 
            aes(x = Jahr, y = Verhältnis, label = Kanton_label, vjust = Kanton_vjust),
            hjust = 1, family = "SRG SSR Type", color = "#555555", size = 3) +    
  geom_text(data = subset(aenderung_prozentpunkte_slope_graph, Jahr == 2015), 
            aes(x = Jahr, y = Verhältnis, label = Verhältnis_label),
            hjust = 0, family = "SRG SSR Type", color = "#555555", size = 3) +
  theme_srf() +
  theme(legend.position = "none", 
    panel.grid.major.y = element_blank(),
    panel.grid.minor.y = element_blank(),
    panel.grid.major.x = element_blank(), 
    axis.ticks.y = element_blank(),
    axis.ticks.x = element_blank(), 
    axis.title.y = element_blank(), 
    axis.text.y = element_blank()) +
  labs(x = NULL,
   y = NULL,
   title = "Anteil klimafreundlicher Heizungen",
   subtitle = "Fernwärme, Wärmepumpen, Sonnenkollektoren, Holzheizungen",
   caption = "Quelle: Gebäude- und Wohnungsregister, BFS, 2017")
p

# ggsave(p, filename = "output/slope.png", width = 8, height = 11)

Heatmap

p <- ggplot(anteil_heizung_2015, aes(Energieträger, GDEKT)) + 
  geom_tile(aes(fill = Verhältnis), colour = "#f5f5f2") + 
  scale_fill_gradient(name = "Anteil an allen Heizungen im Kanton", low = "mediumpurple", high = "khaki3", labels = percent) +
  # geom_text(aes(label = Anzahl_Bindungen), color = "black")  +
  theme_srf() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(x = "Energieträger der Heizung",
   y = NULL,
   title = "Energieträger-Mix nach Kanton, 2015",
   subtitle = "Absteigend sortiert nach Anteil klimafreundlicher Heizungen",
   caption = "") 
p

# ggsave(p, filename = "output/heat.png", width = 8, height = 11)

Dot-Plot

dotplot_data <- aenderung_prozentpunkte_slope_graph %>%
  select(Kanton, Jahr, Verhältnis, GDEKT, Verhältnis_label, Kanton_label) %>%
  mutate(Kanton = factor(GDEKT, levels = rev(nach_typ_kt_2015$GDEKT))) %>%
  mutate(hjust = ifelse(as.character(Jahr) == "2009", 1.2, 0))

p <- ggplot(dotplot_data) +
  geom_path(aes(x = Verhältnis, y = Kanton, group = Kanton), colour = "#AAAAAA"
            ) +
  geom_point(aes(x = Verhältnis, y = Kanton, colour = Jahr)) +
  geom_text(data = subset(dotplot_data, Jahr == 2015),
            aes(x = Verhältnis, y = Kanton, label = Verhältnis_label),  
            hjust = 0, colour = "#555555", size = 4) +
  geom_text(data = subset(dotplot_data, Jahr == 2009), 
            aes(x = Verhältnis, y = Kanton, label = Kanton_label),
            hjust = 1, colour = "#555555", size = 4) +
  scale_x_continuous(labels = scales::percent, limits = c(-.05,.6)) +
  scale_colour_discrete(guide = F) +
  labs(x = NULL,
    y = NULL,
   title = "Anteil klimafreundlicher Heizungen",
   subtitle = "2009, 2015",
   caption = "") +
  xlim(c(-.05, .6)) + 
  theme_srf(
    axis.text = element_blank(),
    axis.ticks = element_blank()
  )
# ggsave(p, filename = "output/dotplot.png", width = 7, height = 5)
p

CSV-Output

prozentpunkte_plot_sortiert %>%
  mutate(Verhältnis_klimafreundlich = round(Verhältnis, 3), Unterschied = round(Unterschied, 3)) %>%  
  select(Jahr, Anteil_klimafreundlich = Verhältnis_klimafreundlich, Unterschied, Kanton = GDEKT) %>% 
  write.csv("output/klimafreundlich.csv", row.names = F)

anteil_heizung_2015 %>% 
  mutate(Verhältnis = round(Verhältnis, 3)) %>%  
  select(Jahr, Energietraeger = Energieträger, Anteil = Verhältnis, Kanton = GDEKT) %>% 
  write.csv("output/energietraeger.csv", row.names = F)