8  Automatyzacja procesu wizualizacji

Kod
source("code/common.R")
Kod
library(dplyr)
library(ggplot2)
library(tidyr)
gm0 = readr::read_csv("data/gapminder_1950_2023.csv")
df1 = select(gm0, Kraj, Rok, Ocz_dl_zycia, PKB_na_osobe)
df0sel = filter(gm0, Rok == 2019)

8.1 Transformacja danych przed wizualizacją

Kod
df1sel_192021 = filter(df1, Kraj %in% c("Polska", "Niemcy", "Francja", "Włochy", "Hiszpania"), Rok %in% c(2019, 2020, 2021))
ggplot(df1sel_192021, aes(Kraj, PKB_na_osobe, fill = Rok)) + 
    geom_col()

Kod
df1sel_192021$Rok = as.factor(df1sel_192021$Rok)
ggplot(df1sel_192021, aes(Kraj, PKB_na_osobe, fill = Rok)) + 
    geom_col()

Kod
# lub
# ggplot(df1sel_192021, aes(Kraj, PKB_na_osobe, fill = as.factor(Rok))) + 
#     geom_col()
Kod
library(forcats)
df1sel_19 = filter(df1, Kraj %in% c("Polska", "Niemcy", "Francja", "Włochy", "Hiszpania"), Rok %in% c(2019))
df1sel_19$Kraj
[1] "Francja"   "Niemcy"    "Włochy"    "Polska"    "Hiszpania"
Kod
df1sel_19$Kraj = fct_reorder(df1sel_19$Kraj, df1sel_19$PKB_na_osobe, max)
df1sel_19$Kraj
[1] Francja   Niemcy    Włochy    Polska    Hiszpania
Levels: Polska Hiszpania Włochy Francja Niemcy
Kod
ggplot(data = df1sel_19, aes(Kraj, PKB_na_osobe)) +
    geom_col()

Kod
ggplot(df1sel_192021, aes(fct_reorder(Kraj, PKB_na_osobe, sum), PKB_na_osobe, fill = Rok)) + 
    geom_col()

8.2 Automatyzacja tworzenia wykresów

8.2.1 Pętle

Pęlta for jest jednym z najczęściej używanych wyrażeń w językach programowania, którego celem jest powtórzenie pewnej operacji o znaną liczbę razy.

Pęlta for jest zbudowana z dwóch elementów: nagłówka określającego powtórzenia, oraz ciała zawierającego obliczenia.

Kod
for (element in wektor) {
  przetwarzanie elementu
}

Stworzenie oddzielnego wykresu dla każdego roku:

Kod
unique_years = unique(gm0$Rok)
unique_years = unique_years[1:20]
Kod
for (i in unique_years){
  print(i)
}
[1] 1950
[1] 1951
[1] 1952
[1] 1953
[1] 1954
[1] 1955
[1] 1956
[1] 1957
[1] 1958
[1] 1959
[1] 1960
[1] 1961
[1] 1962
[1] 1963
[1] 1964
[1] 1965
[1] 1966
[1] 1967
[1] 1968
[1] 1969

Stworzenie oddzielnego wykresu dla każdego roku:

Kod
for (i in unique_years){
  gapminder_year = subset(gm0, Rok == i)
  gg = ggplot(gapminder_year, aes(x = PKB_na_osobe, y = Ocz_dl_zycia, color = Region)) +
    geom_point() +
    labs(x = "PKB na osobę (USD, 2007)",
         y = "Oczekiwana długość życia (lata)",
         color = "Kontynent")
  print(gg)
}

Stworzenie oddzielnego wykresu dla każdego roku:

Kod
for (i in unique_years){
  gapminder_year = subset(gm0, Rok == i)
  gg = ggplot(gapminder_year, aes(x = PKB_na_osobe, y = Ocz_dl_zycia, color = Region)) +
    geom_point() +
    labs(x = "PKB na osobę (USD, 2007)",
         y = "Oczekiwana długość życia (lata)",
         color = "Kontynent",
         title = paste0("Rok ", i))
  print(gg)
}

Zapisanie oddzielnego wykresu dla każdego roku:

Kod
for (i in unique_years){
  gapminder_year = subset(gm0, Rok == i)
  gg = ggplot(gapminder_year, aes(x = PKB_na_osobe, y = Ocz_dl_zycia, color = Region)) +
    geom_point() +
    labs(x = "PKB na osobę (USD, 2007)",
         y = "Oczekiwana długość życia (lata)",
         color = "Kontynent",
         title = paste0("Rok ", i))
  ggsave(filename = paste0("Wykres_rok_", i, ".png"), plot = gg)
}

8.2.2 Programowanie funkcyjne

Języki obsługujące programowanie funkcyjne posiadają jednak szereg narzędzi do przetwarzania funkcji, które zbiorczo są nazywane funkcjonałami (ang. functional). Funkcjonały to funkcje, które przyjmują inne funkcje jako argumenty.

W R istnieje cała rodzina funkcji poświęcona programowaniu funkcyjnemu. Oprócz najczęściej używanych, lapply() i apply(), istnieją również takie funkcje jak sapply(), vapply(), tapply(), mapply() i inne. Dodatkowo, pakiet purrr oferuje ulepszone i rozszerzone narzędzia do programowania funkcyjnego.

Jednym z podstawowych funkcjonałów w R jest lapply(). Funkcjonał lapply() przyjmuje jako pierwszy argument wektor atomowy lub listę, a następnie przetwarza go używając funkcji podanej jako drugi argument FUN.

Poniżej, lapply() wykonuje funkcję konwersja_f_to_c() na kolejnych elementach listy pomiary_f_lista i zwraca nową listę zawierającą wyniki.

Kod
unique_years = unique(gm0$Rok)
lapply(unique_years, plot_year)

Stworzenie oddzielnego wykresu dla każdego roku:

Kod
plot_year2 = function(my_year, my_shape){
  gapminder_year = subset(gm0, Rok == my_year)
  gg = ggplot(gapminder_year, aes(x = PKB_na_osobe, y = Ocz_dl_zycia, color = Region)) +
    geom_point(shape = my_shape) +
    labs(x = "PKB na osobę (USD, 2007)", y = "Oczekiwana długość życia (lata)",
         color = "Kontynent", title = paste0("Rok ", my_year))
  gg
}

Stworzenie oddzielnego wykresu dla każdego roku:

Kod
plot_year2(1952, 3)

Kod
unique_years = unique(gm0$Rok)
lapply(unique_years, plot_year2, my_shape = 3)