El vector de datos que se muestra a continuación representa el número de personas atendidas mensualmente en el servicio de urgencias de un centro de salud durante el año 2009 (datos de enero a diciembre):
atendidos <- c(728,632,596,689,745,865,694,583,657,643,794,887)
atendidos
## [1] 728 632 596 689 745 865 694 583 657 643 794 887
Estos datos se convierten en serie temporal mediante la función ts()
, indicando que esta serie comienza en enero del año 2009 y que tiene una frecuencia de 12 observaciones por año (esto es, una por mes):
atendidos2 <- ts(atendidos,frequency=12,start=c(2009,1))
La representación gráfica de esta serie es:
plot(atendidos2)
Como vemos, las posiciones de las etiquetas del eje X en este gráfico corresponden a una división decimal del año: 2009.0, 2009.1, 2009.2, etc. Esta es la manera genérica de etiquetar los ejes en R. Si queremos que las etiquetas se muestren con los nombres de los meses (lo que sería más natural en este tipo de gráficos), podemos emplear la siguiente sintaxis:
# Generamos el gráfico sin las etiquetas del eje X (opción xaxt="n"):
plot(atendidos2,xaxt="n",xlab="Mes",ylab="Nº de pacientes atendidos")
# Añadimos las etiquetas de los meses:
axis(1,at=time(atendidos2),
labels=format(seq(as.Date("2009/1/1"), by="month", length=12),"%b"))
Esta sintaxis resulta algo complicada ya que exige que el usuario sepa que:
la opción xaxt="n"
suprime el etiquetado del eje X
time(atendidos2)
proporciona las posiciones decimales exactas que corresponden al inicio de cada mes dentro del año (obtenidas simplemente como la secuencia 2009+(0:11)/12
), como podemos comprobar fácilmente:
time(atendidos2)
## Jan Feb Mar Apr May Jun Jul
## 2009 2009.000 2009.083 2009.167 2009.250 2009.333 2009.417 2009.500
## Aug Sep Oct Nov Dec
## 2009 2009.583 2009.667 2009.750 2009.833 2009.917
2009+(0:11)/12
## [1] 2009.000 2009.083 2009.167 2009.250 2009.333 2009.417 2009.500
## [8] 2009.583 2009.667 2009.750 2009.833 2009.917
seq(as.Date("2009/1/1"), by="month", length=12)
genera la secuencia de fechas correspondiente al día 1 de cada mes a lo largo del año 2009:seq(as.Date("2009/1/1"), by="month", length=12)
## [1] "2009-01-01" "2009-02-01" "2009-03-01" "2009-04-01" "2009-05-01"
## [6] "2009-06-01" "2009-07-01" "2009-08-01" "2009-09-01" "2009-10-01"
## [11] "2009-11-01" "2009-12-01"
format(fecha,"%b")
formatea una fecha de modo que se muestre solamente el nombre abreviado del mes:format(seq(as.Date("2009/1/1"), by="month", length=12),"%b")
## [1] "ene" "feb" "mar" "abr" "may" "jun" "jul" "ago" "sep" "oct" "nov"
## [12] "dic"
Una solución más cómoda para construir el mismo gráico es cargar el paquete xts
(extended time series) y ejecutar:
library(xts)
plot(as.xts(atendidos2),xlab="Mes",ylab="Nº de pacientes atendidos")
Si se desea eliminar al año, utilizamos la opción major.format="%b"
:
plot(as.xts(atendidos2),major.format="%b",xlab="Mes",ylab="Nº de pacientes atendidos")
Por cierto, el autor de estas notas encontró esta solución buscando en google la frase “R plot time series with months in x axis”. La primera página devuelta por el buscador fue una página de stackoverflow: http://stackoverflow.com/questions/17758006/time-series-plot-with-x-axis-in-year-month-in-r, en la que un usuario preguntaba algo similar. La respuesta más votada en esa página proporciona la solución mostrada aquí.
Otra página web con información interesante sobre representación de series temporales es http://timelyportfolio.github.io/rCharts_time_series/history.html. En este página se muestra el uso de la librería quantmod
:
library(quantmod)
chartSeries(atendidos2,name="Pacientes atendidos en Centro de Salud")
chartSeries(atendidos2,theme=chartTheme("white"))