Skip to content

Instantly share code, notes, and snippets.

@JonasSchroeder
Last active March 28, 2020 14:11
Show Gist options
  • Save JonasSchroeder/9e3d53e56601b3021f7afb236ad70844 to your computer and use it in GitHub Desktop.
Save JonasSchroeder/9e3d53e56601b3021f7afb236ad70844 to your computer and use it in GitHub Desktop.
Featured in this medium article: "A Beginner’s Guide to Creating a Corona “Dashboard” (Part 1)" https://medium.com/@jonas.schroeder1991/a-beginners-guide-to-creating-a-corona-dashboard-3553b01d8d44
# Data gathered from European Center for Disease Prevention and Control
# https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide
# Note: Number of cases per day may differ from other sources; cases might be moved from one day to another
# Author: Jonas Schröder https://medium.com/@jonas.schroeder1991
library(readxl)
library(httr)
library(tidyverse)
library(dplyr)
library(ggpubr)
# Define date of data pull
url <- paste("https://www.ecdc.europa.eu/sites/default/files/documents/COVID-19-geographic-disbtribution-worldwide-", "2020-03-22", ".xlsx", sep = "")
# DL and read data set
GET(url, authenticate(":", ":", type="ntlm"), write_disk(tf <- tempfile(fileext = ".xlsx")))
data <- read_excel(tf)
#------------------------------------------------------------------------------------------------------------------------------
# VISUALIZE GROWTH PER DAY AND COUNTRY
#------------------------------------------------------------------------------------------------------------------------------
# China
data_china <- filter(data, data$GeoId=="CN")
ggplot(data_china, aes(x=DateRep, y=Cases)) +
geom_point(color = "darkred") +
geom_smooth(method="auto", se=T, color = "darkred") +
xlab("Date") +
ylab("Cases") +
ggtitle("China: New Cases per Day")
ggplot(data_china) +
geom_line(aes(rev(DateRep), cumsum(Cases[order(Cases)])), color = "darkred") +
xlab("Date") +
ylab("Cases") +
ggtitle("China: Cummulative Cases")
# Spain
data_spain <- filter(data, data$GeoId=="ES")
data_spain <- filter(data_spain, data_spain$DateRep > "2020-02-20")
cpd_spain <- ggplot(data_spain, aes(x=DateRep, y=Cases)) +
geom_point(color = "darkorange") +
geom_smooth(method="auto", se=T, color = "darkorange") +
xlab("Date") +
ylab("Cases") +
ggtitle("Spain: New Cases per Day")
ggplot(data_spain) +
geom_line(aes(rev(DateRep), cumsum(Cases[order(Cases)])), color = "darkorange") +
xlab("Date") +
ylab("Cases") +
ggtitle("Spain: Cummulative Cases")
# France
data_france <- filter(data, data$GeoId=="FR")
data_france <- filter(data_france, data_france$DateRep > "2020-02-20")
cpd_france <- ggplot(data_france, aes(x=DateRep, y=Cases)) +
geom_point(color = "blue") +
geom_smooth(method="auto", se=T, color = "blue") +
xlab("Date") +
ylab("Cases") +
ggtitle("France: New Cases per Day")
ggplot(data_france) +
geom_line(aes(rev(DateRep), cumsum(Cases[order(Cases)])), color = "blue") +
xlab("Date") +
ylab("Cases") +
ggtitle("France: Cummulative Cases")
# Germany
data_germany <- filter(data, data$GeoId=="DE")
data_germany <- filter(data_germany, data_germany$DateRep > "2020-02-20")
cpd_germany <- ggplot(data_germany, aes(x=DateRep, y=Cases)) +
geom_point(color = "black") +
geom_smooth(method="auto", se=T, color = "black") +
xlab("Date") +
ylab("Cases") +
ggtitle("Germany: New Cases per Day")
ggplot(data_germany) +
geom_line(aes(rev(DateRep), cumsum(Cases[order(Cases)])), color = "black") +
xlab("Date") +
ylab("Cases") +
ggtitle("Germany: Cummulative Cases")
# Italy
data_italy <- filter(data, data$GeoId=="IT")
data_italy <- filter(data_italy, data_italy$DateRep > "2020-02-20")
cpd_italy <- ggplot(data_italy, aes(x=DateRep, y=Cases)) +
geom_point(color = "darkgreen") +
geom_smooth(method="auto", se=T ,color = "darkgreen") +
xlab("Date") +
ylab("Cases") +
ggtitle("Italy: New Cases per Day")
ggplot(data_italy) +
geom_line(aes(rev(DateRep), cumsum(Cases[order(Cases)])), color = "darkgreen") +
xlab("Date") +
ylab("Cases") +
ggtitle("Italy: Cummulative Cases")
# Country comparison
cpd_comparison_1 <- ggplot() +
geom_line(data=data_italy, aes(x=DateRep, y=Cases, color="Italy")) +
geom_line(data=data_spain, aes(x=DateRep, y=Cases, color="Spain")) +
geom_line(data=data_germany, aes(x=DateRep, y=Cases, color="Germany")) +
geom_line(data=data_france, aes(x=DateRep, y=Cases, color="France")) +
scale_color_manual(values = c(
'Italy' = 'darkgreen',
'Spain' = 'darkorange',
'Germany' = 'black',
'France' = 'blue')) +
labs(color = 'Country') +
xlab("Date") +
ylab("Cases") +
ggtitle("Country Comparison: New Cases per Day") +
theme(
legend.position="right",
axis.title = element_text(size=12),
axis.text = element_text(size=12),
plot.title = element_text(size=14),
legend.title = element_text(size=12),
legend.text = element_text(size=10)
)
cpd_comparison_2 <- ggplot() +
geom_smooth(data=data_italy, aes(x=DateRep, y=Cases), color="darkgreen", method = "loess") +
geom_smooth(data=data_spain, aes(x=DateRep, y=Cases), color="darkorange", method = "loess") +
geom_smooth(data=data_germany, aes(x=DateRep, y=Cases), color="black", method = "loess") +
geom_smooth(data=data_france, aes(x=DateRep, y=Cases), color="blue", method = "loess") +
xlab("Date") +
ylab("Cases") +
ggtitle("New Cases per Day (Interpolated)") +
theme(
legend.position="right",
axis.title = element_text(size=12),
axis.text = element_text(size=12),
plot.title = element_text(size=14),
legend.title = element_text(size=12),
legend.text = element_text(size=10)
)
ggplot() +
geom_line(data=data_italy, aes(x=rev(DateRep), y=cumsum(Cases[order(Cases)]), color = "Italy")) +
geom_line(data=data_germany, aes(x=rev(DateRep), y=cumsum(Cases[order(Cases)]), color = "Germany")) +
geom_line(data=data_spain, aes(x=rev(DateRep), y=cumsum(Cases[order(Cases)]), color = "Spain")) +
geom_line(data=data_france, aes(x=rev(DateRep), y=cumsum(Cases[order(Cases)]), color = "France")) +
xlab("Date") +
ylab("Cases") +
scale_color_manual(values = c(
'Italy' = 'darkgreen',
'Spain' = 'darkorange',
'Germany' = 'black',
'France' = 'blue')) +
theme(
legend.position="right",
axis.title = element_text(size=12),
axis.text = element_text(size=12),
plot.title = element_text(size=14),
legend.title = element_text(size=12),
legend.text = element_text(size=10)
) +
ggtitle("Country Comparison: Total Number of Cases (Cumulative)")
# Merge plots to dashboard
part1 <- ggarrange(cpd_italy, cpd_spain, cpd_germany, cpd_france, align="hv")
part2 <- ggarrange(cpd_comparison_2, cpd_comparison_1, ncol=2, align="h")
ggarrange(part1, part2, nrow=2, heights=c(2,3), align="hv")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment