J'aimerais préciser le plot de ma série temporelle, le script fonctionne mais ne me convient pas encore tout à fait pour la représentation graphique.
Pour cela j'aurais besoin d'aide et de conseils si cela est possible.
J'ai un tableau, 2 colonnes, la 1e avec des dates (2017-01-01 à 2017-12-31, avec un pas de temps journalier, class vector) et la seconde avec des températures (class numeric)
Mon objectif est d'obtenir une série temporelle en sélectionnant une période de temps à l'intérieur de mon tableau et de pouvoir le représenter avec un axe des abscisses gradué. Par exemple, je souhaite représenter le mois d'avril 2017, et sa série temporelle de T° jour après jour.
Mon code ci-dessous représente tout le cheminement vers ce résultat. C'est la fin qui importe, avec l'utilisation de la fonction ts pour les séries temporelles.
Comment dois-je la modifier pour partir par exemple du 2017-04-01 jusqu'au 2017-04-30, avec une graduation journalière ? Lorsque j'ajoute l'argument end pour la date, j'ai des messages d'erreur.
Merci pour vos conseils !
Code : Tout sélectionner
#Repertoire de travail
setwd("C:/XXX")
#Packages nécessaires
library(ncdf4)
library(stringr)
library(Rcpp)
library(plyr)
library(lubridate)
library(ggplot2)
#Ouverture du fichier
nc <-nc_open("NOAA_SST_2017_Corse.nc")
print(nc)
#Variables
lon <- ncvar_get(nc, "lon")
dim(lon)
lat <- ncvar_get(nc, "lat")
dim(lat)
time1 = ncvar_get(nc, "time")
time = as_date(time1,tz="UTC",origin = "1800-01-01")
dim(time)
#Zoom géographique
lonIdx <- which( lon >= 8.4 & lon <= 9.7)
latIdx <- which( lat >= 41.3 & lat <= 43.1)
levelIdx <- 1:length(time)
#Construction du dataframe
data_temp<-ncvar_get(nc, "sst")[lonIdx, latIdx, levelIdx]
indices <- expand.grid(lon[lonIdx], lat[latIdx], time[levelIdx])
df <- data.frame(cbind(indices, as.vector(data_temp)))
colnames(df)<-c("longitude","latitude","time","temperature")
#Verifier son tableau
View(df)
Final1 = df
write.table(df,"NOAA_SST_2017_Corse")
##enlever les NA
df2 = na.omit(df)
##moyenne par jour
Final1 <- tapply(df2$temperature,df2$time,mean)
Final1 = as.data.frame(Final1)
View(Final1)
colnames(Final1) = "temperature"
Final2 = as.data.frame(cbind("time"=rownames(Final1),"temperature"=Final1$temperature))
Final2
View(Final2)
> head(Final2)
jour temp
1 2017-01-01 15.88318
2 2017-01-02 15.81000
3 2017-01-03 15.85045
4 2017-01-04 15.86500
5 2017-01-05 15.73000
6 2017-01-06 15.45773
> tail(Final2)
jour temp
360 2017-12-26 14.02045
361 2017-12-27 13.89318
362 2017-12-28 13.81000
363 2017-12-29 13.89091
364 2017-12-30 13.96409
365 2017-12-31 14.04682
#verification du type de données
class(Final2$temperature)
class(Final2$time)
#modification de l'intitulé des variables
names(Final2)[1]<-"jour"
names(Final2)[2]<-"temp"
#changement du type de données (vers type chaine de caractères)
Final2$temp<-as.character(Final2$temp)
##changement du type de données (vers type numérique)
Final2$temp<-as.numeric(Final2$temp)
class(Final2$temp)
class(Final2$jour)
> class(Final2$temp)
[1] "numeric"
> class(Final2$jour)
[1] "factor"
#Création de la série temporelle (la fonction ts prend en compte la périodicité des données)
ts.stt<-ts(data = Final2$temp, start=c(2017,04),frequency = 365.25)
#representation graphique
install.packages("itsmr")
library(itsmr)
windows()
plotc(ts.stt)
Enfin, si j'essaie un autre type de plot (code ci-dessous), j'obtiens les erreurs ci-dessous et un graphe dont l'axe des abscisse ne va pas (pas de date, pas de graduation).
Error in del/by : argument non numérique pour un opérateur binaire
De plus : Warning message:
In Ops.factor(to, if (int) as.double(from) else from) :
‘-’ not meaningful for factors
Code : Tout sélectionner
plot(Final2$jour, Final2$temp, type = "l", xaxt = "n", xlab = "",
ylab = "SST moyenne/jour", col = "royalblue3")
axis.POSIXct(1, at = seq(Final2$jour[1], tail(Final2$jour, 1), "date"),
format = "%y/%m/%d", las = 2)