[R] is there a way to avoid "traveling" grid?

Dimitri Liakhovitski dimitri.liakhovitski at gmail.com
Tue Oct 5 16:37:17 CEST 2010


Hello!

If you run the whole code below, it'll produce a stacked diagram. And
it looks good - because the tick-marks are aligned with the grid.
However, if I stretch the graph window, grid becomes misaligned with
the tickmarks. Or, rather, it seems aligned for the first and the last
tick mark, but not for tickmarks in between.
Can it be addressed?
Thank you!

Dimitri


### Creating a data set with both positives and negatives
my.data<-data.frame(date=c(20080301,20080401,20080501,20080601,20080701,20080801,20080901,20081001,20081101,20081201,20090101,20090201,20090301,20090401,20090501,20090601,20090701,20090801,20090901,20091001,20091101,20091201,20100101,20100201,20100301,20100402,20100503),
x=c(1.1, 1, 1.6, 1, 2, 1.5, 2.1, 1.3, 1.9, 1.1, 1, 1.6, 1, 2, 1.5,
2.1, 1.3, 1.9, 1.1, 1, 1.6, 1, 2, 1.5, 2.1, 1.3, 1.9),
y=c(-4,-3,-6,-5,-7,-5.2,-6,-4,-4.9,-4,-3,-6,-5,-7,-5.2,-6,-4,-4.9,-4,-3,-6,-5,-7,-5.2,-6,-4,-4.9),
z=c(-0.2,-0.3,-0.4,-0.1,-0.2,-0.05,-0.2,-0.15,-0.06,-0.2,-0.3,-0.4,-0.1,-0.2,-0.05,-0.2,-0.15,-0.06,-0.06,-0.2,-0.3,-0.4,-0.1,-0.2,-0.05,-0.2,-0.15),
a=c(10,13,15,15,16,17,15,16,14,10,13,15,15,16,17,15,16,14,10,13,15,15,16,17,15,16,14))
my.data$date<-as.character(my.data$date)
my.data$date<-as.Date(my.data$date,"%Y%m%d")
(my.data)
str(my.data)

positives<-which(colSums(my.data[2:ncol(my.data)])>0) # which vars
have positive column sums?
negatives<-which(colSums(my.data[2:ncol(my.data)])<0) # which vars
have negative column sums?

y.max<-1.1*max(rowSums(my.data[names(positives)])) # the max on the y
axis of the chart
y.min<-1.1*min(rowSums(my.data[names(negatives)])) # the min on the y
axis of the chart
ylim <- c(y.min, y.max)
order.positives<-rev(rank(positives))
order.of.pos.vars<-names(order.positives)
order.negatives<-rev(rank(negatives))
order.of.neg.vars<-names(order.negatives)
order<-c(order.negatives,order.positives)
order.of.vars<-names(order)   # the order of variables on the chart -
from the bottom up
### so, the bottom-most area should be for z, the second from the
bottom area- for y (above z)

all.colors<-c('red','blue','green','orange','yellow','purple')
xx <- c(my.data$date, rev(my.data$date))
bottom.y.coordinates<-rowSums(my.data[names(negatives)])


par(mar=c(5,4,4,6),xpd=F)
plot(x=my.data$date, y=bottom.y.coordinates, ylim=ylim, col='white',
type='l', xaxt='n',
	ylab='Title for Y', xlab="", main='Chart Title')

for(var in order.of.neg.vars){
	top.line.coords<-bottom.y.coordinates-my.data[[var]]
	bottom.coords<-c(bottom.y.coordinates,rev(top.line.coords))
	polygon(xx,bottom.coords,col=all.colors[which(names(my.data) %in% var)])
	bottom.y.coordinates<-top.line.coords
}

for(var in order.of.pos.vars){
	top.line.coords<-bottom.y.coordinates+my.data[[var]]
	bottom.coords<-c(bottom.y.coordinates,rev(top.line.coords))
	polygon(xx,bottom.coords,col=all.colors[which(names(my.data) %in% var)])
	bottom.y.coordinates<-top.line.coords
}

axis(1, labels =format(as.Date(my.data$date, origin="1970-01-01"),
"%Y-%m-%d"), at=my.data$date, las=2,cex.axis=0.7)
grid(nx=(length(my.data$date)-1),ny=NULL,col = "lightgray", lty =
"dotted",lwd = par("lwd"))

legend(par()$usr[2],
  mean(par()$usr[3:4]),
  c("Blue","Yellow","Green","Orange"),
  xpd=T,
  bty="n",
  pch=12,
  col=c("Blue","Yellow","Green","Orange"))



More information about the R-help mailing list