Пакет за генериране на COVID-19 графики от отворените данни на България, EUROSTAT, ECDC, НСИ.

Ако сте един от тях…

Ако работите за държавата и имате нещо общо с обработката и публикацията на COVID-19 данни, изпълнете гражданския си дълг и станете whistleblower. Разяснете на обществото как се взимат решенията да се скриват елементарни показатели (напр. географска и възрастова разбивка на смъртните случаи, но и много други).

Инсталация

За инсталация директно от GitHub, въведете в R или (още по-добре) в RStudio:

install.packages("remotes")
remotes::install_github("StanTraykov/c19bg")

Ако има проблеми с текущата работна версия, може да изтеглите последния рилийз и инсталирате с install.packages("<път към сваления файл>") или директно от R:

install.packages("remotes")
remotes::install_github("StanTraykov/c19bg", ref = "v0.1.1")

Опционално: шрифтове

Еднократно и незадължително. Позволява ползването на шрифтове при извеждането на екран и записването в растерни формати (PNG, JPEG). Не влияе на векторния SVG изход (вкл. по-нататъшна обработка с външни програми).

Windows

За да ползвате шрифтовете на Windows в R, инсталирайите extrafont:

install.packages("extrafont")
extrafont::font_import() # отнема време

macOS

R може да ползва шрифтовете на macOS директно, но macOS може да не разполага с шрифта по подразбиране в графиките (Calibri). Ако имате инсталиран MS Office, можете да създадете папка и копирате шрифтовете от Office в нея.

$ mkdir ~/Library/Fonts/Microsoft
$ cd ~/Library/Fonts/Microsoft
$ cp -a /Applications/Microsoft\ Word.app/Contents/Resources/DFonts/* .

Ако нямате MS Office, вижте Homebrew и brew cask install font-microsoft-office.

Опционално: ImageMagick и Inkscape за по-качестевен растерен изход

Windows

  • Inkscape
    • Инсталирайте в мястото по подразбиране (C:\Program Files\Inkscape\bin\inkscape.exe) или укажете къде е в опциите (виж по-долу).
  • ImageMagick
    • Сложете в %PATH% или укажете къде е magick.exe в опциите (виж по-долу).

macOS

  • Inkscape—ползвайте версията за macOS
    • Ще бъде открит, ако е в мястото по подразбиране (/Applications/Inkscape.app/Contents/MacOS/inkscape"). Можете да укажете друго в опциите (виж по-долу).
    • Ако имате проблеми, ползвайте последната версия в разработка (latest development version)
  • ImageMagick
    • Инсталирайте с Homebrew (brew install imagemagick)
    • Уверете се, че bin директорията на Homebrew (обикновено /opt/homebrew/bin или /usr/local/bin) е в $PATH. За RStudio е достатъчно, ако прибавите пътя в /etc/paths. (Добавянето в .zprofile важи само за zsh и няма да има ефект.)

Генериране на всички графики

library(c19bg)

# бързо генериране на SVG (високо качество)
# - отиват в c19bg/plots в текущата папка (обикн. Documents под Windows)
# - в c19bg/data ще намерите изтеглените данни и изчислен R (estR.csv)
c19_save_all()

# бързо генериране на PNG, без презареждане от Интернет (dl = F)
c19_save_all(file_ext = ".png", dl = F)

# JPEG
c19_save_all(file_ext =".jpg", dpi = 125, quality = 100)

# PNG 2000x2000px
c19_save_all(file_ext = ".png", dpi = 200, w = 10, h = 10)

# растеризация с Inkscape, JPEG компресия с ImageMagick
# - по-високо качество на PNG и JPEG, но по-бавно
# - вижте раздел Опции за указване на пътища към програмите
c19_inkmagick()  # генерира SVG, PNG и JPEG файлове
# или
c19_inkmagick(dl = F)  # без презареждане от Интернет

# вкл. графики за умирания в други страни (ЕС+)
c19_inkmagick(d_all = TRUE)

Пакетът ще се свърже с data.egov.bg, ECDC, EUROSTAT, за да вземе необходимите данни. Данните и графиките ще се запишат в подпапка c19bg на текущата (обикновено Documents при отваряне на R под Windows). За да използвате записаните данни (c19bg/data) без повторно сваляне от Интернет, добавете параметър dl = F на функциите за запис на всички графики (вж. примерите).

Забележка: Изчисляването на репродуктивното число R трае няколко минути, може и над 10 на по-стари компютри. Резултатите се запазват (вкл. при затваряне на R) до промяна в изходните данни.

Опции

Опциите могат да се зададат директно в R конзолата или в .Rprofile или сроден файл за автоматично изпълнение при стартиране на R.

# промяна на шрифт
options(c19bg.font_family = "Calibri")
options(c19bg.font_scale = 1) # скалиране на всички текстове (напр. 0.8, 1.1)
options(c19bg.font_size = 14) # базов размер (пробвайте първо font_scale)
# Забележка: за промяна на размер/резолюция, използвайте аргумент dpi
# във функциите за изход.

options(c19bg.output_dir = "c19bg/plots") # ще бъдат създадени, ако ги няма
options(c19bg.data_dir = "c19bg/data")

options(c19bg.output = list(
    inkopts = "-w %d --export-filename",
    mgkopts = "-quality 100",
    pixwidth = 1375,
    width = 11,
    height = 7,
    inkscape = "\"C:\\Program Files\\Inkscape\\bin\\inkscape.exe\"",
    magick = "magick"  # работи, ако е в PATH
))

# изобразяване на всички опции за пакета
library(c19bg) # предварително зададени опции ще се запазят
names(options())[grep("c19bg",names(options()))]

Генериране на единични графики

library(c19bg)

# зареждане на шрифтове за екран/растерен запис (ако са инсталирани)
if (.Platform$OS.type == "windows" &&
        "extrafont" %in% rownames(installed.packages())) {
    extrafont::loadfonts(device = "win")
}

# слчуаи по възрастови групи
my_plot <- c19_var_plot("age",
                        roll_func = mean,
                        roll_window = 7,
                        line_legend = "0")

# 14-дневно плаващо средно за Европа, Америка с
# изпъкване на Германия
my_plot2 <-c19_eu_weekly("r14_cases",
                         continents = c("Europe", "America"),
                         lower_y = 0,
                         highlight = "DE")

# извеждане на екран
my_plot # или print(my_plot) в неинтерактивен режим
my_plot2
c19_oblasts(incid_100k = TRUE) # извеждане директно на екран

# запис във файл
ggplot2::ggsave(file = "my_plot.png", width = 11, height = 7, plot = my_plot)

# R-графика на екран
# (отнема време, освен ако R вече не е изчислен)
c19_r_plot()

# за разлика от функциите за масово записване, които по подразбиране теглят
# от Интернет, презареждането трябва да се указва ръчно:
c19_reload() # презареждане от диск (c19bg/data)
c19_reload(redownload = TRUE) # презареждане от Интернет

# помощ
?c19_var_plot
?c19_eu_weekly #etc

Документация на публичните функции в пакета

Данни

library(c19bg)

# Данните могат да се достъпят с тези две функции
# (те се използват и от графичните фукнции)
eu_data <- c19_eu_data()
bg_data <- c19_bg_data()

# При първо изпълнение, те свалят и обработват данни от
# data.egov.bg, ECDC, и EUROSTAT. Това трае известно време.
# Последващи повиквания връщат вече заредените данни. За
# презареждане, напр.:
new_bg_data <- c19_bg_data(reload = TRUE) # от диск
new_eu_data <- c19_eu_data(redownload = TRUE) # от Интернет

# Съдържанието може да се разглежда/задълбава в браузера
# на данни на RStudio.

# ECDC/EUROSTAT седмични случаи, смъртни случаи от COVID-19,
# свръхсмъртност, фактори на надвишаване, брой хоспитализирани,
# тестове, позитивност
View(eu_data$factor_tab)

# Умирания по седмици от EUROSTAT
View(eu_data$eurostat_deaths)

# За България
View(bg_data$gen_inc_hist) # обща статистика, вкл. ограничен набор
                           # данни от преди да отворят данните
View(bg_data$age)          # по възраст (днвени)
View(bg_data$subdivs)      # по области (дневни)

Примерна заявка и графика

Плаващо средно 7 дни по области.

library(dplyr)
library(tidyr)
library(ggplot2)
library(c19bg)

bg_data <- c19_bg_data()
oblasts_table <- bg_data$subdivs %>%
    select(!ends_with("_ACT")) %>%
    pivot_longer(cols = !matches("date"),
                 names_to = "oblast",
                 names_pattern = "(.*)_ALL",
                 values_to = "cases") %>%
    group_by(oblast) %>%
    mutate(mva7 = zoo::rollapply(cases,
                                 7,
                                 mean,
                                 align = "right",
                                 fill = NA))

# графика
my_plot <- ggplot(data = oblasts_table,
                  mapping = aes(x = date, y = mva7, color = oblast)) +
    geom_line()
    
my_plot # изобразяване на екран
ggsave(file = "my_plot.svg", plot = my_plot, width = 13, height = 8)