library(ggplot2)  
library(dplyr)    
library(knitr)
library(tidyverse)
library(maps)
## Warning: le package 'maps' a été compilé avec la version R 4.2.2
library(sf)
## Warning: le package 'sf' a été compilé avec la version R 4.2.2
library(rnaturalearth)
## Warning: le package 'rnaturalearth' a été compilé avec la version R 4.2.2
library(rnaturalearthdata)
## Warning: le package 'rnaturalearthdata' a été compilé avec la version R 4.2.2
library(s2)
library(lubridate)
library(gganimate)
## Warning: le package 'gganimate' a été compilé avec la version R 4.2.2
library(gifski)
## Warning: le package 'gifski' a été compilé avec la version R 4.2.2
library(png)
## Warning: le package 'png' a été compilé avec la version R 4.2.2

On commence par récupérer les données dans une variable que l’on nomme Gros_Gus.

Gros_Gus <- read.csv('daily_weather_data.csv')
Gros_Gus <- Gros_Gus %>% 
  #Afin d'harmoniser l'ortographe des différentes Data.
  mutate(country = ifelse(country == 'Czech Republic' , 'Czech Rep.' , country)) %>% 
  mutate(date = dmy(date))
  #change le format de date pour correspondre a Tidyverse

Je trie mes données afin de faire apparaitre plus simplement le jour l’année et le mois. Afin de représenté plus simplement la vitesse du vent dans mes graphique à venir je la lisse avec une fonction logarithme.

DateYear <- ymd(Gros_Gus$date) %>% 
  substr(0,4)
DateMonth <- ymd(Gros_Gus$date) %>% 
  substr(6,7)
DateDay <- ymd(Gros_Gus$date) %>% 
  substr(9,10)

Gros_Gus <- Gros_Gus %>%
  mutate(year = DateYear) %>% 
  mutate(month = DateMonth) %>% 
  mutate(day=DateDay) %>% 
  mutate(Gros_Gus,LogWSPD = log(wspd)) %>% 
  mutate(Gros_Gus, LogPres = log(pres))

Afin de pouvoir observer l’évolution de la température pour un pays en particulier je pose 3 fonctions dans lesquelles nous pouvons choisir un pays en particulier et afficher la température sur l’ensemble des données. Sur une période de 1 an. Sur une période de 1 mois pour une année en particulier.

Average_Temp_country <- function(w){
Gros_Gus %>% 
  filter(country == w) %>% 
  ggplot(aes(date,tavg))+
  geom_line()+
  labs(title = paste('Evolution de la température de 2018 à 2021 pour', w))
}
Average_Temp_country('France')

Ici nous représentons le graphique pour une année en particulier.

Average_Temp_year <- function(w,x){
Gros_Gus %>% 
  filter(country == w, year == x) %>% 
  ggplot(aes(date,tavg))+
  geom_line()+
    labs(title=paste('Evolution de la température en',x,'pour',w ))
}
Average_Temp_year('Abkhazia',2019)

Une tentative de travail sur une animation en GIF pour le graphe courbe. Dans les faits ce n’est pas très utile un graphe statique est plus pertinent pour observer les données.

p <- Gros_Gus %>% 
  filter(country == 'France', year == 2019)

pplot <- ggplot(p,aes(date,tavg))+
  geom_line()
pplot2 <- ggplot(p,aes(date,tavg, group = interaction(date))) +
  geom_point()
pplot2

graph1.animation =  pplot +
  transition_reveal(date) + 
  view_follow(fixed_y = TRUE)

animate(graph1.animation, height = 500, width = 800, fps = 30, duration = 10,
        end_pause = 60, res = 100)
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?

Ici je fais une animation GIF mais cette fois avec les points.

graph2.animation =  pplot2 +
  transition_reveal(date)

animate(graph2.animation, height = 500, width = 800, fps = 30, duration = 15,
        end_pause = 60, res = 100)

Dans l’objectif de pouvoir affiner une période je propose une fonction ou on observe sur un mois pour un pays en particulier.

Average_Temp_year_month <- function(w,x,v){
Gros_Gus %>% 
  filter(country == w, year == x , month == v) %>% 
  ggplot(aes(date,tavg))+
  geom_line()+
  labs(title= paste('Température en',w, 'pendant la période du mois  :',v,'/',x))
}
Average_Temp_year_month('France','2019','09')

Dans la suite j’ai souhaité tenter de représenter l’évolution de la température mais également de la vitesse du vent et de sa direction pour les pays concerné. Afin de gagner en visibilité sur ma carte je me suis concentré sur les pays de l’UE. Je commence donc par faire une liste des pays.

    #Liste des pays de l'union européenne afin de limiter la taille de la carte pour plus de lisibilité. 
EU_C <- c("Austria","Belgium","Bulgaria","Croatia","Cyprus",
                    "Czech Rep.","Denmark","Estonia","Finland","France",
                    "Germany","Greece","Hungary","Ireland","Italy","Latvia",
                    "Lithuania","Luxembourg","Malta","Netherlands","Poland",
                    "Portugal","Romania","Slovakia","Slovenia","Spain",
                    "Sweden")

J’utilise une base de donnée supplémentaire afin de pouvoir tracer ma carte et je filtre les pays avec la liste EU_C proposé précedemment.

world_map <- ne_countries(scale = 50, returnclass = 'sf')
#Roboto est utile pour sélectionner uniquement les pays de l'UE
Roboto <- 
  world_map %>% 
  filter(name %in% EU_C)
#Comme nous nous concentrons sur le continent européen nous limitons la carte.
bbox_europe <- st_bbox(c(xmin = -10, ymin = 20, xmax = 50, ymax = 80), crs = st_crs(Roboto))
Croboto <- st_crop(Roboto, bbox_europe)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
# Il manque des dates pour certains pays comme cyprus et il manque Bulgaria dans ma base de données.
Dating_Gus <- Gros_Gus %>% 
  filter(date == '2020-01-01')

#Pour voir si il manque des* pays dans la Data de meteo. Ici il manque Bulgaria.
EU_C[!(EU_C %in% Gros_Gus$country)]
## [1] "Bulgaria"

J’ai choisis de procéder par une série de fonction afin de laisser le choix dans l’observation de la période ou du pays.

Selection me permet donc de filter un pays pour une date précise.

Selection <- function(d,p){
  Gros_Gus %>% 
    filter(date == d , country == p)
}

SelectionEurope me permet de choisir une date uniquement.

SelectionEurope <- function(d){
  Gros_Gus %>% 
    filter(date == d)
}

Afin de pouvoir placer les positions des différentes capitales je fais une fonction Selection_coordafin de récupérer la longitude et la latitude. Coordonnées qui me seront également utiles afin de pouvoir créer mon vecteur de direction du vent.

Selection_coord <- function(d,p){
  Gros_Gus %>% 
    filter(date == d , country == p ) %>% 
  dplyr::select(Longitude,Latitude) %>% 
    #Je dois unlist mon résultat sinon quand je l'appelle dans EuropeCountry j'ai un soucis pour les coordonnées. 
    unlist()
}
#ça me sort ainsi les coordonnées de longitude et lattitude pour la date et le pays qui nous intéresse.
Selection_coord('2020-01-01','France')[1]
## Longitude 
##  2.352222
Selection_coord('2020-01-01','France')[2]
## Latitude 
## 48.85661

Sangaest la fonction que je vais utiliser pour représenter le graphique d’un pays spécifique. Je fais donc une jointure entre Croboto et Selection qui représente respectivement la liste des pays de l’UE filter dans ma base de donnée world avec une restriction pour centrer le schéma, et le pays que je choisis.

#Sanga est la fonction pour l'affichage d'un pays spécifique de l'UE
Sanga <- function(d,p){ 
  Croboto %>% 
    #Le filter me permet d'afficher que le pays qui m'intéresse
  left_join(Selection(d,p), by = c("name" = "country")) %>% 
    filter(name == p) 
}

SangaEurope sera pour la carte de l’Europe en suivant la mĂªme logique que prĂ©cĂ©demment mais avec uniquement une sĂ©lection sur la date.

#SangaEurope est la fonction pour l'affichage des pays de l'UE pour une date spécifique. 

SangaEurope <- function(d){ 
  Croboto %>% 
    #Le filter me permet d'afficher que le pays qui m'intéresse
  left_join(SelectionEurope(d), by = c("name" = "country"))
}

La fonction rotation me permettra de calculer la point d’arrive de mon vecteur représentant la vitesse du vent.

rotation <- function(theta, wspd){
  #les nouvelles coordonnées newlong et newlat sont les coordonnées après rotation d'un angle theta en entrée de la fonction rotation et la selection des valeurs dans la 7eme et la 8eme colonnes (radlong et radlat)
  newlong <- wspd * cos(theta)
  newlat <- wspd * sin(theta)
  
  newdata <- data.frame(newlong,newlat)
  return(newdata)
}

EuropeCountry représente ma fonction qui me permet d’afficher un pays de l’UE à une date précise avec un indicateur de la position de la capitale. La couleur du pays représente la température en comparaison avec les extremes de température moyenne sur l’année. La flèche indique la direction du vent et la longueur de la flèche une indication sur la vitesse du vent. Dans le cas ou il n’y a pas d’informations sur la vitesse ou la direction du vent sur le jour en particulier le vecteur n’apparait simplement pas.

J’ai voulu tenter de reprĂ©senter par la taille du point indiquant la capitale la pression atmosphĂ©rique, mais les variations de pression ne sont pas assez importantes pour Ăªtre bien visible.

PresSize <- function(d,p){
  Gros_Gus %>% 
  filter(country == p) %>% 
  filter(date == d ) %>% 
  select(pres)
}
EuropeCountry <- function(d,p){
  d <- ymd(d)
  
  datatemp <- Sanga(d,p) %>%
    mutate(radwdir = wdir*pi/180) %>% 
    mutate(EndLong = rotation(radwdir, LogWSPD)[[1]]) %>% 
    mutate(EndLat = rotation(radwdir, LogWSPD)[[2]])
  
extrem_GUS <- Gros_Gus %>% 
  filter(country == p) %>% 
  filter(year == year(d))
SizePres <- Gros_Gus$pres

  
  ploteurop <- ggplot(data = datatemp) +
  geom_sf(mapping = aes(fill = tavg)) +
  scale_fill_gradient(name = "TAVG",low = "yellow", high = 'Red',  na.value = "grey50", limits = c(min(extrem_GUS$tavg, na.rm = TRUE), max(extrem_GUS$tavg, na.rm=TRUE))) +
    geom_point(x =Selection_coord(d,p)[1] , y = Selection_coord(d,p)[2], col = "black", size = PresSize(d,p)/800)+
    geom_segment(aes(x=Selection_coord(d,p)[1],y=Selection_coord(d,p)[2],xend=Selection_coord(d,p)[1]+EndLong, yend=Selection_coord(d,p)[2]+EndLat, na.rm=TRUE),
            arrow=arrow(angle=35, length = unit(0.25, "cm"), ends = "last", type = 'open'), )
  
  ploteurop + 
    labs(title = paste("Temperature de la capitale :",datatemp$tavg, '°C le', datatemp$date)) + 
    xlab("latitude") + 
    ylab("longitude")
}

#Dans le cas ou il manque la vitesse du vent et la direction la flèche n'apparait pas. 
EuropeCountry('2020-4-24','Germany')

Ma fonction Europeme permet d’afficher la température moyenne de chaque capitale de l’UE pour une daté précise avec une indication sur l’emplacement de chacunes des capitales.

Europe <- function(d){
  dataTempEu <- Gros_Gus %>% 
    filter(date == d)
ggplot(data = SangaEurope(d)) +
  geom_sf(mapping = aes(fill = tavg)) +
  geom_point(aes(x=Longitude, y = Latitude)) +
  scale_fill_gradient(name = "TAVG",low = "yellow", high = 'Red',  na.value = "grey50") +
  labs(title = paste("Temperature en °C le ", dataTempEu$date)) 
} 
Europe('2020-05-07')
## Warning: Removed 2 rows containing missing values (geom_point).

##Animation :

Afin de tenter de voir l’évolution de la température sur une année complète j’ai fais un GIF de la carte de l’Europe.

world_map2 <- ne_countries(scale = 50, returnclass = 'sf')
#Roboto est utile pour sélectionner uniquement les pays de l'UE
Roboto2 <- 
  world_map2 %>% 
  filter(name %in% EU_C)
#As we want to focus only on the European continent, we can crop the data by defining a bounding box:
bbox_europe2 <- st_bbox(c(xmin = -10, ymin = 20, xmax = 50, ymax = 80), crs = st_crs(Roboto2))
Croboto2 <- st_crop(Roboto2, bbox_europe)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries

Je reprends la majorité de la fonction Europeen ajoutant avec le package gganimate une transition en fonction de ma variable date.

Sangaold <- 
  Croboto2 %>% 
  left_join(Gros_Gus, by = c("name" = "country"))

DateYear2 <- ymd(Sangaold$date)

EuropeYearGif <- Sangaold %>% 
  filter(year == 2020)

pplot3 <- ggplot(data = EuropeYearGif) +
  geom_sf(mapping = aes(fill = tavg)) +
  geom_point(aes(x=Longitude, y = Latitude)) +
  transition_time(date)+
  scale_fill_gradient(name = "TAVG",low = "yellow", high = 'Red',  na.value = "grey50")+
  labs(title="Température en °C : {frame_time}")
pplot3