interval.codes <- data.frame(f=c("%Y-%m-%d","%Y-%m","%Y"),
p=c("","-01","-01-01"),
xlab.line=c(5,4,3),
row.names=c("day","month","year"))
# it is interesting to show time series on top of each other
# so support this via y=vector => same behavoir as now
# y=list(goals=list(data=c(...),pch=20,col=),list(data=c(...),lty=1,lwd=,col=))
# for pch, plot as points with that pch val
# for lty, plot as lines with that lty val
generic.time.series <- function(d,y,transform='none',label.interval='day',
ylab="Set the 'ylab' parameter to a title for this axis!",
xlab="Set the 'xlab' parameter to a title for this axis!",
main="Set the 'main' parameter to a title for this plot!",
decimal.places=2) {
# Parse label.interval
fstr <- as.character(interval.codes[label.interval,'f'])
pstr <- as.character(interval.codes[label.interval,'p'])
xlab.line <- as.numeric(interval.codes[label.interval,'xlab.line'])
# Reduce datetime to requested format
d <- as.POSIXct(strptime(d,'%F'))
data <- data.frame(x=as.integer(d),posix=d,y=y)
data <- data[sort(data$x,i=T)$i,]
if (transform=='cumulative') {
data$y <- cumsum(data$y)
left <- min(data$y)
right <- max(data$y)
} else { # plot all the data values themselves
vals <- unique(y)
if(length(vals)<10){
left <- vals[vals<median(vals)]
right <- vals[vals>=median(vals)]
} else {
left <- c(min(data$y),data$y[1])
right <- c(max(data$y),data$y[length(data$y)])
}
}
par(mar=c(6,4,3,4)+0.1,mgp=c(3,0.5,0))
plot(data$x,data$y,bty='n',yaxt='n',xaxt='n',
ylab=ylab,main=main,xlab='')
title(xlab=xlab,line=xlab.line)
label.data <- unique(data.frame(x=data$x,posix=data$posix))
axis(1,label.data$x,format(label.data$posix,fstr),las=2,lty=0)
axis(2,round(unique(left),decimal.places),las=1,lty=0)
axis(4,round(unique(right),decimal.places),las=1,lty=0)
}
##debug(generic.time.series)