ECDC - Casos e óbitos por Covid-19 nos Países Nórdicos

Dinamarca, Finlândia, Islândia, Noruega e Suécia

Casos e óbitos por Covid-19 nos Países Nórdicos
Casos e óbitos por Covid-19 nos Países Nórdicos

Os quatro gráficos acima mostram os novos casos e óbitos (últimas 24 horas) e o total de casos e óbitos acumulados até esta data para os Países Nórdicos (Dinamarca, Finlândia, Islândia, Noruega e Suécia). Como pode ser observado, embora o acumulado de casos e óbitos da Suécia seja maior do que o dos demais países, o número de casos novos (últimas 24 horas) na Dinamarca, Finlândia e Noruega são os maiores, assim como os óbitos nas últimas 24 horas da Finlândia e da Dinamarca são os maiores no grupo. As regiões autônomas das Ilhas Faroé, arquipélago da Åland e Groenlândia não aparecem nos gráficos, porque os valores são muito pequenos.

Dados

Os dados são baixados da página Download today’s data on the geographic distribution of COVID-19 cases worldwide do European Centre for Disease Prevention and Control (ECDC). Nesta página é mostrado como os dados mais atualizados podem ser lidos diretamente pelo código R, mas também é possível baixar o arquivo CSV e ler pelo programa, para evitar múltiplos downloads, no caso de haver vários programas que acessem estes mesmos dados. O ECDC mudou para um cronograma de relatórios semanais da situação do COVID-19 na UE / EEE, Reino Unido e no restante do mundo em 17 de dezembro de 2020. Portanto, todas as atualizações diárias foram interrompidas a partir de 14 de dezembro.

Programa

Abaixo está mostrado o código do programa, escrito em R, que gera os quatro gráficos mostrando os novos casos e óbitos (últimas 24 horas) e o total de casos e óbitos acumulados até a data do arquivo baixado para os Países Nórdicos (Dinamarca, Finlândia, Islândia, Noruega e Suécia). Antes de ser executado as bibliotecas utilizadas precisam ser instaladas. A opção para ler os dados diretamente na Internet está comentada, enquanto a opção para ler o arquivo CSV baixado está ativa. Pode ser usada qualquer uma das duas opões, obtendo-se os mesmos resultados, desde que o arquivo baixado esteja atualizado.

#
# source('ecdc_nordic_countries.R')
#
# Programa para gerar uma imagem contendo quatro gráficos
# (novos casos, novas mortes, total de casos, total de mortes)
# por COVID-19 nos países nórdicos.
# Os dados são obtidos do:
# European Centre for Disease Prevention and Control (ECDC)
# Download today’s data on the geographic distribution of COVID-19 cases worldwide
# https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide
#
# Bibliotecas
library(utils)
library(dplyr)
library(lubridate)
library(ggplot2)
library(ggrepel)
library(grid)
library(gridExtra)

# Países nórdicos
nordics <- c('Norway','Sweden','Denmark','Finland','Iceland')

# Ler os dados do ECDC no formato CSV
# ecdc <- read.csv("https://opendata.ecdc.europa.eu/covid19/casedistribution/csv", na.strings = "", fileEncoding = "UTF-8-BOM")
ecdc <- read.csv("~/R/dados/ecdc.csv", na.strings = "", fileEncoding = "UTF-8-BOM")

# Criar um quadro de dados com os dados da ECDC convertendo a data
df <- data.frame(data = parse_date_time(ecdc$dateRep, orders = "dmy"),
	cases = ecdc$cases,
	deaths = ecdc$deaths,
	country = ecdc$countriesAndTerritories,
	continent = ecdc$continentExp)

# Data dos dados = maior data do arquivo
lastUpdate = toString(max(df$data))

# Calcular o total de casos e mortes por país
sum_cases_deaths <- aggregate(df[,2:3], by=list(country = df$country), FUN=sum)

# Casos e mortes novos (últimas 24 horas)
today_cases_deaths <- df[df$data == max(df$data), ]

# Dados de hoje: novos e acumulados
today_data <- merge(today_cases_deaths, sum_cases_deaths, by="country", suffixes = c(".new",".total"))

# Dados dos países nórdicos
nordic_data <- today_data[today_data$country %in% nordics, ]

data <- arrange(nordic_data, country)

letalidade = data$deaths.total / data$cases.total * 100.00

# Total de óbitos por país

data$pos = (cumsum(c(0, data$deaths.total)) + c(data$deaths.total / 2, .01))[1:nrow(data)]

tot_deaths <- ggplot(data, aes(1, deaths.total, fill = country)) +
    geom_col(
        color = 'black', 
        position = position_stack(reverse = TRUE),
        show.legend = FALSE
    ) +
    geom_text(
        aes(
            x = 1.2,
            label = prettyNum(deaths.total, big.mark=".", decimal.mark=","),
        ),
        position = position_stack(reverse = TRUE, vjust = 0.5),
        size = 3
    ) +
    geom_text_repel(
        aes(x = 1.4,
            y = pos,
            label = sprintf("%s\n(%.1f%%)", country, letalidade)
        ),
        nudge_x = 0.5,
        nudge_y = 1.0,
        hjust = 1,
        vjust = 1,
        size = 3,
        segment.size = .7, 
        show.legend = FALSE
    ) +
    coord_polar('y') +
    theme(
        plot.title = element_text(size=11),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "white", colour = "white")
    ) +
    labs(
        x = NULL,
        y = NULL,
        title = "Óbitos Acumulados (Letalidade %)"
    )

# Novos óbitos por país (últimas 24 horas)

data$pos = (cumsum(c(0, data$deaths.new)) + c(data$deaths.new / 2, .01))[1:nrow(data)]

new_deaths <- ggplot(data, aes(1, deaths.new, fill = country)) +
    geom_col(
        color = 'black', 
        position = position_stack(reverse = TRUE),
        show.legend = FALSE
    ) +
    geom_text(
        aes(
            x = 1.2,
            label = prettyNum(deaths.new, big.mark=".", decimal.mark=","),
        ),
        position = position_stack(reverse = TRUE, vjust=0.5),
        size = 3
    ) +
    geom_text_repel(
        aes(x = 1.4,
            y = pos,
            label = country
         ), 
        nudge_x = 0.5,
        nudge_y = 0.5,
        hjust = 1,
        vjust = 1,
        size = 3,
        segment.size = .7, 
        show.legend = FALSE
    ) +
    coord_polar('y') +
    theme(
        plot.title = element_text(size=11),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "white", colour = "white")
    ) +
    labs(
        x = NULL,
        y = NULL,
        title = "Novos Óbitos (últimas 24 horas)"
    ) 

# Total de Casos por país

data$pos = (cumsum(c(0, data$cases.total)) + c(data$cases.total / 2, .01))[1:nrow(data)]

tot_cases <- ggplot(data, aes(1, cases.total, fill = country)) +
    geom_col(
        color = 'black', 
        position = position_stack(reverse = TRUE),
        show.legend = FALSE
    ) +
    geom_text(
        aes(
            x = 1.2,
            label = prettyNum(cases.total, big.mark=".", decimal.mark=","),
        ),
        position = position_stack(reverse = TRUE, vjust=0.5),
        size = 3
    ) +
    geom_text_repel(
        aes(x = 1.4, y = pos, label = country), 
        nudge_x = 0.5,
        nudge_y = 0.5,
        hjust = 1,
        vjust = 1,
        size = 3,
        segment.size = .7, 
        show.legend = FALSE
    ) +
    coord_polar('y') +
    theme(
        plot.title = element_text(size=11),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "white", colour = "white")
    ) +
    labs(
        x = NULL,
        y = NULL,
        title = "Casos Acumulados"
    )

# Novos de Casos por País (últimas 24 horas)

data$pos = (cumsum(c(0, data$cases.new)) + c(data$cases.new / 2, .01))[1:nrow(data)]

new_cases <- ggplot(data, aes(1, cases.new, fill = country)) +
    geom_col(
        color = 'black', 
        position = position_stack(reverse = TRUE),
        show.legend = FALSE
    ) +
    geom_text(
        aes(
            x = 1.2,
            label = prettyNum(cases.new, big.mark=".", decimal.mark=","),
        ),
        position = position_stack(reverse = TRUE, vjust=0.5),
        size = 3
    ) +
    geom_text_repel(
        aes(x = 1.4, y = pos, label = country), 
        nudge_x = 0.5,
        nudge_y = 0.5,
        hjust = 1,
        vjust = 1,
        size = 3,
        segment.size = .7, 
        show.legend = FALSE
    ) +
    coord_polar('y') +
    theme(
        plot.title = element_text(size=11),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "white", colour = "white")
    ) +
    labs(
        x = NULL,
        y = NULL,
        title = "Novos Casos (últimas 24 horas)"
    )

# Juntar os quatro gráficos em um

plot <- grid.arrange(new_cases, new_deaths, tot_cases, tot_deaths,
    nrow=2,
    top="COVID-19 nos Países Nórdicos",
    bottom = textGrob(
        paste("Fonte: European Centre for Disease Prevention and Control (ECDC)\n",
              "Dados baixados de 'https://www.ecdc.europa.eu/en' em ",
              lastUpdate
             ),
        hjust = 0.5,
        gp = gpar(fontface = 3, fontsize = 9)
    )
)

# Gravar a imagem do gráfico no disco
ggsave("../img/ecdc_nordic_countries.svg", plot, device=svg())