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