Mejorando (ligeramente) la representación gráfica de una serie temporal

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)

plot of chunk unnamed-chunk-3

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

plot of chunk unnamed-chunk-4

Esta sintaxis resulta algo complicada ya que exige que el usuario sepa que:

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)
##  [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(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")

plot of chunk unnamed-chunk-9

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

plot of chunk unnamed-chunk-10



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

plot of chunk unnamed-chunk-11

chartSeries(atendidos2,theme=chartTheme("white"))

plot of chunk unnamed-chunk-11