2012-04-13 31 views
7

Tengo un marco de datos con una columna como fecha/hora (almacenada internamente como numérica) y otras columnas como numéricas/enteras y quiero graficar datos con fecha/hora.Trazado de datos contra tiempo en R

La fecha/hora en el marco de datos se llenó utilizando lo siguiente.

as.POSIXct(strptime(time, '%H:%M:%S %p %m/%d/%Y',tz='GMT')) 

class(table$time) es numeric.

  1. ¿Cómo puedo representar y mostrar los datos en el eje x como la fecha de lectura en algún formato?
  2. Cómo trazar un subconjunto de filas y no todas las filas Ej: las filas entre dateTime1 y dateTime2 donde dateTime1 y dateTime2 están dadas en un formato determinado.
+1

¿Podría ser posible que muestre cómo se ve su marco de datos? Tengo problemas para entender cómo tu 'tiempo' puede ser tanto numérico como de la forma '% H:% M:% S% p% m /% d /% Y' al mismo tiempo. – plannapus

Respuesta

7

Aquí es un poco de datos ficticios:

data <- structure(list(time = structure(c(1338361200, 1338390000, 1338445800, 1338476400, 1338532200, 1338562800, 1338618600, 1338647400, 1338791400, 1338822000), class = c("POSIXct", "POSIXt"), tzone = ""), variable = c(168L, 193L, 193L, 201L, 206L, 200L, 218L, 205L, 211L, 230L)), .Names = c("time", "variable"), row.names = c(NA, -10L), class = "data.frame") 
data 
       time variable 
1 2012-05-30 09:00:00  168 
2 2012-05-30 17:00:00  193 
3 2012-05-31 08:30:00  193 
4 2012-05-31 17:00:00  201 
5 2012-06-01 08:30:00  206 
6 2012-06-01 17:00:00  200 
7 2012-06-02 08:30:00  218 
8 2012-06-02 16:30:00  205 
9 2012-06-04 08:30:00  211 
10 2012-06-04 17:00:00  230 

Para mostrar la fecha y la hora en el eje de la función axis.POSIXct puede utilizar:

plot(data, xaxt="n") 
axis.POSIXct(side=1, at=cut(data$time, "days"), format="%m/%d") 

Usted puede controlar donde las garrapatas caen con at (en cuanto a la función normal axis excepto que se debe proporcionar con objetos de la clase POSIXct) y controlar cómo aparecerán con format.

Por lo que se refiere a subconjuntos, siempre y cuando los objetos dateTime1 y dateTime2 también sean objetos POSIXct puedes hacerlo como lo harías con cualquier otro tipo de subconjunto.

dateTime1 <- strptime("00:00 05/31/2012", format="%H:%M %m/%d/%Y") 
dateTime2 <- strptime("3 Jun 2012 05-30", format="%d %b %Y %H-%M") 
data[data$time < dateTime2 & data$time > dateTime1, ] 
       time variable 
3 2012-05-31 08:30:00  193 
4 2012-05-31 17:00:00  201 
5 2012-06-01 08:30:00  206 
6 2012-06-01 17:00:00  200 
7 2012-06-02 08:30:00  218 
8 2012-06-02 16:30:00  205 
10

También podría utilizar ggplot2, más específicamente geom_point o geom_line (Nota que utilizo los datos del ejemplo de @plannapus):

require(ggplot2) 
theme_set(theme_bw()) # Change the theme to my preference 
ggplot(aes(x = time, y = variable), data = data) + geom_point() 

enter image description here

o usando una geometría de línea:

ggplot(aes(x = time, y = variable), data = data) + geom_line() 

enter image description here

ggplot2 reconoce automáticamente que el tipo de datos del eje x es una fecha, y dibuja el eje en consecuencia.

+0

+1 de hecho mucho más conveniente que el mío. ¿Existe también una manera de controlar el formato de las etiquetas o su ubicación si es necesario? – plannapus

+1

Sí, puede usar 'scale_x_date' o' scale_x_datetime' para ajustar las escalas. Vea su documentación para algunos ejemplos. –

Cuestiones relacionadas