2011-01-30 32 views
36

Sé que esta pregunta puede ser un cliché, pero estoy teniendo dificultades para hacerlo.Trazado de series de tiempo con etiquetas de fecha en el eje x

Tengo conjunto de datos en el siguiente 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 

que quiero crear un gráfico de series de tiempo, con el eje x representa el tiempo & ocasiones en eje de ordenadas. Además, quiero marcar el eje x con la fecha. El código que estaba usando es el siguiente:

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

Eso es el código que estaba utilizando? ¿Funcionó? ¿No funciona ahora? ¿Cuál es el mensaje de error? – Spacedman

+1

Escribí una utilidad Rscript flexible para exactamente este caso de uso, tomando su CSV de serie temporal y haciendo un buen gráfico, p. el que se muestra a continuación. Obténgalo en github: https://github.com/doofdoofsf/plotTimeSeries – user2246801

Respuesta

6

Su código tiene muchos errores.

  • Usted está mezclando hasta dm$Day y dm$day. Probablemente no es lo mismo
  • Sus encabezados de columna son Date y Visits. Por lo que tendría acceso a ellos (supongo) como dm$Date y dm$Visits
  • En el campo de la fecha tiene %Y-%m-%d esto debería ser %m/%d/%Y

El siguiente código debe trazar lo que quiere:

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

1) Dado que los tiempos son fechas, asegúrese de utilizar la clase "Date", no "POSIXct" o "POSIXlt". Consulte R News 4/1 para obtener consejos e intente esto donde Lines se define en la Nota al final. No se usan paquetes aquí.

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) 

El uso de text = Lines es sólo para mantener el ejemplo autónomo y, en realidad, sería reemplazado con algo como "myfile.dat". (Continúa después de la imagen)

screenshot

2) Como se trata de una serie de tiempo es posible que desee utilizar una representación de series de tiempo dando código un poco más sencillo:

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) 

Dependiendo de lo que quiere la trama para que parezca suficiente solo para usar plot(Visits ~ Date, dm) en el primer caso o plot(z) en el segundo caso, suprimir por completo el comando axis.

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

me gusta usar el ggplot2 para este tipo de cosas:

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

enter image description here

2

Puede girar las fechas por la piratería notaciones ejes con texto ()

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

Es posible en ggplot y se puede utilizar para esta tarea scale_date

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

me gusta ggplot también.

Aquí hay un ejemplo:

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

Cuestiones relacionadas