---
title: "Yet another COVID19 plot, The Series"
output: html_notebook
---
```{r include=FALSE}
library(dplyr)
library(readr)
library(lubridate)
library(ggplot2)
```
## Contributing to the COVID19 plot madness!
*Last updated `r today()`

[Source: European Centre for Disease Prevention and Control](https://opendata.ecdc.europa.eu/covid19/casedistribution/csv)
```{r message=FALSE, warning=FALSE, include=FALSE}
edc_data<-read_csv("https://opendata.ecdc.europa.eu/covid19/casedistribution/csv")

#edc_data %>% group_by(countriesAndTerritories) %>% summarise(n=n())

countries <-c("Argentina",
               "Chile",
               "Brazil",
               "Peru",
               "Ecuador",
               "Uruguay",
               "Colombia",
               "Venezuela",
               "Bolivia",
               "Paraguay"
               )

#countries <- c("Spain","Italy","France","Argentina","United_States_of_America","China")

edc_data<-edc_data %>% filter(countriesAndTerritories %in% countries) %>% 
  select(countriesAndTerritories,cases,deaths,dateRep,popData2019) %>% 
  mutate(dateRep=dmy(dateRep)) %>% mutate(country=countriesAndTerritories) %>% rename(Date=dateRep) %>%   arrange((Date)) 

edc_data<-edc_data%>% group_by(country) %>%
  mutate(cumulative_cases=cumsum(cases),cumulative_deaths=cumsum(deaths)) %>% mutate(deadper100k=cumulative_deaths/(popData2019/1e5))

#edc_data


```


```{r eval=FALSE, fig.height=5, fig.width=10, message=FALSE, warning=FALSE, include=FALSE}
lastdays=30
plot<-edc_data %>% filter(Date > today()-lastdays) %>%
  ggplot(aes(x=Date))+
  geom_point(data=edc_data %>% filter(Date > today()-lastdays) %>%filter(day(Date) %% 3 == 0),
             aes(y=deadper100k
                 ,color=country),shape=1)+
   geom_line(aes(y=deadper100k,color=country),linetype="dashed")+
  
  scale_x_date(date_breaks = "7 day", date_labels = "%d %b") +
  scale_y_continuous(breaks = scales::pretty_breaks(n = 10)) +
  labs(y = "Number of deaths [per 100,000 pop.]", 
       x= "Time in Days", 
       title =paste("COVID19: Number of Deaths per Country in the last ",lastdays," days.",sep=""), 
       subtitle = "South America Region",
       caption = "Source: European Centre for Disease Prevention and Control")+
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
  #theme(legend.position="top")
#plot
plotly::ggplotly()
```

```{r echo=FALSE, fig.height=5, fig.width=10, warning=FALSE}

start_date<-edc_data %>% arrange(country) %>%  filter(cumulative_deaths>=1 & lag(cumulative_deaths,n=1) ==0)  %>% select(country,Date,cumulative_cases) 
 
start_date_vector <-start_date$Date
 names(start_date_vector)<-start_date$country
  
edc_data_diff<-edc_data  %>%  mutate(day=Date - ymd(start_date_vector[`country`] )) %>% filter(day >0) %>% select(country,day,Date,deadper100k) 
  
plot2<-edc_data_diff %>%  
  ggplot(aes(x=day))+
  geom_point( data = edc_data_diff %>% filter(as.numeric(day, units="days") %% 3 == 0),
             aes(y=deadper100k
                 ,color=country),shape=1,alpha=0.5,size=2)+
   geom_line(aes(y=deadper100k,color=country),linetype="dashed")+
  
  #scale_x_date(date_breaks = "7 day", date_labels = "%d %b") +
  scale_y_continuous(breaks = scales::pretty_breaks(n = 10)) +
  labs(y = "Number of deaths [per 100,000 pop.]", 
       x= "Time in days since first death", 
       title =paste("COVID19: Number of Deaths since first death was reported. Updated ",today(),sep=""), 
       subtitle = "South America Region",
       caption = paste("Source: European Centre for Disease Prevention and Control.",sep=""))+
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
  #theme(legend.position="top")
#plot2
plotly::ggplotly()
```

```{r echo=FALSE, fig.height=5, fig.width=10, message=FALSE, warning=FALSE}

edc_data<-read_csv("https://opendata.ecdc.europa.eu/covid19/casedistribution/csv")

countries <- c("Spain","Italy","France","Argentina","United_States_of_America","China","Germany")

edc_data<-edc_data %>% filter(countriesAndTerritories %in% countries) %>% 
  select(countriesAndTerritories,cases,deaths,dateRep,popData2019) %>% 
  mutate(dateRep=dmy(dateRep)) %>% mutate(country=countriesAndTerritories) %>% rename(Date=dateRep) %>%   arrange((Date)) 

edc_data<-edc_data%>% group_by(country) %>%
  mutate(cumulative_cases=cumsum(cases),cumulative_deaths=cumsum(deaths)) %>% mutate(deadper100k=cumulative_deaths/(popData2019/1e5))



start_date<-edc_data %>% arrange(country) %>%  filter(cumulative_deaths>=1 & lag(cumulative_deaths,n=1) ==0)  %>% select(country,Date,cumulative_cases) 
 
start_date_vector <-start_date$Date
 names(start_date_vector)<-start_date$country
  
edc_data_diff<-edc_data  %>%  mutate(day=Date - ymd(start_date_vector[`country`] )) %>% filter(day >0) %>% select(country,day,Date,deadper100k) 
  
plot2<-edc_data_diff %>%  
  ggplot(aes(x=day))+
  geom_point( data = edc_data_diff %>% filter(as.numeric(day, units="days") %% 3 == 0),
             aes(y=deadper100k
                 ,color=country),shape=1,alpha=0.5,size=2)+
   geom_line(aes(y=deadper100k,color=country),linetype="dashed")+
  
  #scale_x_date(date_breaks = "7 day", date_labels = "%d %b") +
  scale_y_continuous(breaks = scales::pretty_breaks(n = 10)) +
  labs(y = "Number of deaths [per 100,000 pop.]", 
       x= "Time in days since first death", 
       title =paste("COVID19: Number of Deaths since first death was reported. Updated ",today(),sep=""), 
       subtitle = "Argentina and other countries",
       caption = paste("Source: European Centre for Disease Prevention and Control.",sep=""))+
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
  #theme(legend.position="top")
#plot2
plotly::ggplotly()
```

