2011-01-30 2 views
36

So che questa domanda potrebbe essere un cliché, ma ho difficoltà a farlo.Tracciare le serie temporali con le etichette Data sull'asse x

ho set di dati nel seguente formato:

 
    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 

voglio creare un grafico di serie temporali, con asse x rappresenta il tempo & visite qui asse y. Inoltre, voglio segnare l'asse x con la data. Il codice che stavo usando è il seguente:

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")) 
+2

Questo è il codice che si stava utilizzando? Ha funzionato? Non funziona ora? Qual è il messaggio di errore? – Spacedman

+1

Ho scritto una flessibile utility Rscript esattamente per questo caso d'uso, prendendo il tuo CSV delle serie temporali e facendo un bel grafico per es. quello mostrato di seguito. Scaricalo su github: https://github.com/doofdoofsf/plotTimeSeries – user2246801

risposta

6

Il tuo codice ha molti errori.

  • Si sta mescolando dm$Day e dm$day. Probabilmente non è la stessa cosa
  • Le intestazioni delle colonne sono Date e Visits. Quindi li avrebbe accesso (sto cercando di indovinare) come dm$Date e dm$Visits
  • Nel campo data, sarà necessario %Y-%m-%d questo dovrebbe essere %m/%d/%Y

Il seguente codice dovrebbe tracciare ciò che si vuole:

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

1) Poiché le date indicate sono certe, utilizzare la classe "Date", non "POSIXct" o "POSIXlt". Vedi R News 4/1 per un consiglio e prova questo dove Lines è definito nella nota alla fine. Nessun pacchetto è usato qui.

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'uso di text = Lines è solo per mantenere l'esempio autonomo e in realtà sarebbe stato sostituito con qualcosa di simile "myfile.dat". (Dopo immagine continua)

screenshot

2) Poiché si tratta di una serie storica che si potrebbe desiderare di utilizzare una rappresentazione serie tempo dando il codice leggermente più semplice:

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) 

A seconda di ciò che si vuole la trama per apparire come potrebbe essere sufficiente solo per utilizzare plot(Visits ~ Date, dm) nel primo caso o plot(z) nel secondo caso sopprimendo il comando axis interamente.

Nota:

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" 
18

Mi piace usare il ggplot2 per questo genere di cose:

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

enter image description here

2

È possibile ruotare le date hacking notazioni asse con testo ()

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) 
2

E 'possibile in ggplot ed è possibile utilizzare scale_date per questo compito

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") 
-1

mi piace ggplot troppo.

Ecco un esempio:

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