Dimitri Liakhovitski
2010-Oct-04 21:16 UTC
[R] adding a legend to the plot (but outside of it)
Hello! My code below creates a data frame and a plot for it. However, I can't figure out how to add a legend that is not ON the plot itself, but outside of it (e.g., to the right of my graph or below it). I tried something: I put a line par(xpd=T, mar=par()$mar+c(0,0,0,4)) right before my plot command), but that screwed up all my gridlines - they covered all graph and do not coincide with tickmarks anymore. Any help would be greatly appreciated! Dimitri 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)]) 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")) -- Dimitri Liakhovitski Ninah Consulting www.ninah.com
Right before the plot statement add: par(mar=c(5,4,4,6),xpd=F) then at the end add legend(par()$usr[2], mean(par()$usr[3:4]), c("Blue","Yellow","Green","Orange"), xpd=T, bty="n", pch=15, col=c("Blue","Yellow","Green","Orange")) On Mon, Oct 4, 2010 at 5:16 PM, Dimitri Liakhovitski < dimitri.liakhovitski@gmail.com> wrote:> Hello! > > My code below creates a data frame and a plot for it. > However, I can't figure out how to add a legend that is not ON the > plot itself, but outside of it (e.g., to the right of my graph or > below it). I tried something: I put a line par(xpd=T, > mar=par()$mar+c(0,0,0,4)) right before my plot command), but that > screwed up all my gridlines - they covered all graph and do not > coincide with tickmarks anymore. > Any help would be greatly appreciated! > Dimitri > > > > > 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)]) > > 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")) > > -- > Dimitri Liakhovitski > Ninah Consulting > www.ninah.com > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]