2011-10-27 18 views
9

¿Hay una visualización básica del calendario en R, como el programa cal de Unix?Visualización básica del calendario en R

Me doy cuenta de que no es tan difícil ajustar las funciones básicas de fecha/hora (como weekdays, seq.date, etc.), pero siento que ignoro algo bastante básico que puede resolverse en uno de los momentos excepcionales/fecha paquetes que ya existen. Por otra parte, siempre comienza lo suficientemente simple: asignar días de la semana, pero luego uno puede pasar años, diseño para calendarios que abarcan varios meses (aunque me conformaría con solo imprimir 1 mes), y así sucesivamente.

Mi uso actual implica el cambio de R a Linux o un programa de calendario en Windows. Hacer esto en R sería más fácil.


Nota 1. He mirado en algunos de los varios widgets disponibles para Gtk2 y TclTk - por alguna razón, la instalación de sistemas de apoyo no está funcionando bien (y yo creo que es una exageración grave, ni es muy bueno desde una perspectiva de portabilidad para tener tales dependencias). En Windows, incluso he probado Cygwin, para acceder al cal, pero esa instalación parece estar en conflicto con Rtools. En resumen, agregar capas de cosas no es una avenida particularmente productiva en este momento. :) No he encontrado ninguna solución en lubridate, xts, zoo y otros paquetes, aunque es posible que haya olvidado algo.

+0

¿Qué tal sistema '('cal')'? – kohske

+0

@kohske - Eso depende del sistema operativo. Funciona en UNIX, pero no en Windows ... –

+0

Exactamente. Es por eso que este es un comentario, no una respuesta. – kohske

Respuesta

12

Aquí es una función que hará el calendario anual o mensual básica:

cal <- function(month, year) { 

     if(!require(chron)) stop('Unable to load chron package') 

    if(missing(year) && missing(month)) { 
     tmp <- month.day.year(Sys.Date()) 
     year <- tmp$year 
     month <- tmp$month 
    } 


    if(missing(year) || missing(month)){ # year calendar 
     if(missing(year)) year <- month 
     par(mfrow=c(4,3)) 
     tmp <- seq.dates(from=julian(1,1,year), to=julian(12,31,year)) 
     tmp2 <- month.day.year(tmp) 
     wd <- do.call(day.of.week, tmp2) 
     par(mar=c(1.5,1.5,2.5,1.5)) 
     for(i in 1:12){ 
      w <- tmp2$month == i 
      cs <- cumsum(wd[w]==0) 
      if(cs[1] > 0) cs <- cs - 1 
      nr <- max(cs) + 1 
      plot.new() 
      plot.window(xlim=c(0,6), ylim=c(0,nr+1)) 
      text(wd[w], nr - cs -0.5 , tmp2$day[w]) 
      title(main=month.name[i]) 
      text(0:6, nr+0.5, c('S','M','T','W','T','F','S')) 
     } 

    } else { # month calendar 

     ld <- seq.dates(from=julian(month,1,year), length=2, by='months')[2]-1 
     days <- seq.dates(from=julian(month,1,year), to=ld) 
     tmp <- month.day.year(days) 
     wd <- do.call(day.of.week, tmp) 
     cs <- cumsum(wd == 0) 
     if(cs[1] > 0) cs <- cs - 1 
     nr <- max(cs) + 1 
     par(oma=c(0.1,0.1,4.6,0.1)) 
     par(mfrow=c(nr,7)) 
     par(mar=c(0,0,0,0)) 
     for(i in seq_len(wd[1])){ 
      plot.new() 
      #box() 
     } 
     day.name <- c('Sun','Mon','Tues','Wed','Thur','Fri','Sat') 
     for(i in tmp$day){ 
      plot.new() 
      box() 
      text(0,1, i, adj=c(0,1)) 
      if(i < 8) mtext(day.name[wd[i]+1], line=0.5, 
       at=grconvertX(0.5,to='ndc'), outer=TRUE) 
     } 
     mtext(month.name[month], line=2.5, at=0.5, cex=1.75, outer=TRUE) 
     #box('inner') #optional 
    } 
} 

Puede editar varias piezas para personalizarlo. Puede usar par(mfg=c(r,c)) para agregar texto, gráficos u otra información a una celda determinada en el calendario mensual (consulte updateusr y subplot en el paquete TeachingDemos para obtener una posible ayuda al agregar un diagrama).

Estos son algunos ejemplos de la adición de texto o parcelas al calendario:

cal(10,2011) 
par(mfg=c(3,2)) # monday oct 10 
text(.5,.5, 'Some\nText', cex=2) 

par(mfg=c(2,3)) #Tues oct 4 
text(1,1, 'Top Right', adj=c(1,1)) 

par(mfg=c(2,4)) # Wed oct 5 
text(0,0, 'Bottom Left', adj=c(0,0)) 

par(mfg=c(6,2)) # oct 31 
tmp.x <- runif(25) 
tmp.y <- rnorm(25,tmp.x,.1) 
par(usr=c(range(tmp.x), range(tmp.y))) 
points(tmp.x,tmp.y) 
+0

+1 Eso es muy bueno. Eso también introduce muchas funciones que desconocía. – Iterator

+1

Parece que esta es la mejor respuesta que obtendré, pero solo necesito una. :) Lo invito a que lo incluya en un pequeño paquete, es muy útil, o en su propio paquete 'TeachingDemos'. Estoy sorprendido de que aún no esté familiarizado con este. ¡Gracias! – Iterator

+0

@Greg gracias por publicar. Muy útil. –

Cuestiones relacionadas