web-dev-qa-db-fra.com

Tracé de séries chronologiques avec des étiquettes de date sur l'axe des x

Je sais que cette question pourrait être un cliché, mais j'ai du mal à le faire.

J'ai des données dans le format suivant:

 Date Visites 

 01/11/2010 696537 
 11/2/2010 718748 
 11/3/2010 799355 
 04/11/2010 805800 
 05/11/2010 701262 
 06/11/2010 531579 
 07/11/2010 690068 
 08/11/2010 756947 
 11/9/2010 718757 
 11/10/2010 701768 
 11/11/2010 820113 
 11/12/2010 645259 

Je souhaite créer un graphique chronologique, l’axe des abscisses représentant les vistes de l’axe des temps et des ordonnées. Aussi, je veux marquer l'axe des x avec la date. Le code que j'utilisais est le suivant:

dm$newday = as.POSIXct(strptime(dm$Day, format="%Y-%m-%d"))
plot(as.Date(dm$day),dm$visits)
axis.Date(1,Day,at=seq(as.Date("2010/10/30"), as.Date("2011/01/29"),by="days"))
40
user538233

1) Étant donné que les heures sont des dates, veillez à utiliser la classe "Date" et non pas "POSIXct" ou "POSIXlt". Voir R News 4/1 pour des conseils et essayez ceci où Lines est défini dans la note à la fin. Aucun paquet n'est utilisé ici.

dm <- read.table(text = Lines, header = TRUE)
dm$Date <- as.Date(dm$Date, "%m/%d/%Y")
plot(Visits ~ Date, dm, xaxt = "n", type = "l")
axis(1, dm$Date, format(dm$Date, "%b %d"), cex.axis = .7)

L’utilisation de text = Lines sert simplement à garder l’exemple autonome et, en réalité, il serait remplacé par quelque chose comme "myfile.dat". (suite après image)

 screenshot

2) Puisqu'il s'agit d'une série chronologique, vous pouvez utiliser une représentation chronologique donnant un code légèrement plus simple:

library(Zoo)

z <- read.Zoo(text = Lines, header = TRUE, format = "%m/%d/%Y")
plot(z, xaxt = "n")
axis(1, dm$Date, format(dm$Date, "%b %d"), cex.axis = .7)

Selon l'apparence que vous voulez donner au tracé, il peut suffire d'utiliser simplement plot(Visits ~ Date, dm) dans le premier cas ou plot(z) dans le deuxième cas, en supprimant entièrement la commande axis.

Remarque:

Lines <- "Date            Visits
11/1/2010   696537
11/2/2010   718748
11/3/2010   799355
11/4/2010   805800
11/5/2010   701262
11/6/2010   531579
11/7/2010   690068
11/8/2010   756947
11/9/2010   718757
11/10/2010  701768
11/11/2010  820113
11/12/2010  645259"
48
G. Grothendieck

J'aime utiliser le ggplot2 pour ce genre de chose:

df$Date <- as.Date( df$Date, '%m/%d/%Y')
require(ggplot2)
ggplot( data = df, aes( Date, Visits )) + geom_line() 

enter image description here

20
Prasad Chalasani

Votre code contient beaucoup d'erreurs. 

  • Vous mélangez dm$Day et dm$day. Probablement pas la même chose
  • Vos en-têtes de colonne sont Date et Visits. Donc, vous y accéderiez (je suppose) comme dm$Date et dm$Visits
  • Dans le champ de date vous avez %Y-%m-%d cela devrait être %m/%d/%Y

Le code suivant devrait indiquer ce que vous voulez:

dm$newday = as.Date(dm$Date, "%m/%d/%Y")
plot(dm$newday, dm$Visits)
7
csgillespie

C'est possible dans ggplot et vous pouvez utiliser scale_date pour cette tâche

 library(ggplot2)  
 Lines <- "Date            Visits
    11/1/2010   696537
    11/2/2010   718748
    11/3/2010   799355
    11/4/2010   805800
    11/5/2010   701262
    11/6/2010   531579
    11/7/2010   690068
    11/8/2010   756947
    11/9/2010   718757
    11/10/2010  701768
    11/11/2010  820113
    11/12/2010  645259"
    dm <- read.table(textConnection(Lines), header = TRUE)
    dm <- mutate(dm, Date = as.Date(dm$Date, "%m/%d/%Y"))
    ggplot(data = dm, aes(Date, Visits)) + 
    geom_line() + 
    scale_x_date(format = "%b %d", major =  "1 day")
3
dickoa

Vous pouvez faire pivoter les dates en piratant les notations d'axe avec text ()

Lines <- "Date            Visits
11/1/2010   696537
11/2/2010   718748
11/3/2010   799355
11/4/2010   805800
11/5/2010   701262
11/6/2010   531579
11/7/2010   690068
11/8/2010   756947
11/9/2010   718757
11/10/2010  701768
11/11/2010  820113
11/12/2010  645259"

dm <- read.table(textConnection(Lines), header = TRUE)
dm$Date <- as.Date(dm$Date, "%m/%d/%Y")
plot(Visits ~ Date, dm, xaxt = "n", type = "l")
axis(1,at=NULL, labels=F)
text(x = dm$Date, par("usr")[3]*.97, labels = paste(dm$Date,' '), srt = 45, pos = 1, xpd = TRUE,cex=.7)
3
jdonaldson

J'aime aussi ggplot.

Voici un exemple:

df1 = data.frame(
date_id = c('2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04'),          
nation = c('China', 'USA', 'China', 'USA'), 
value = c(4.0, 5.0, 6.0, 5.5))

ggplot(df1, aes(date_id, value, group=nation, colour=nation))+geom_line()+xlab(label='dates')+ylab(label='value')

enter image description here

0
guobz