[R] adding a legend to the plot (but outside of it)

Dimitri Liakhovitski dimitri.liakhovitski at gmail.com
Tue Oct 5 16:33:15 CEST 2010


Thanks a lot, Thomas.
May I ask 2 questions:

1. Is there a way to "fill" the legend rectangles with color
(currently, they just contain a colored cross)?
2. Currently, my graph grabs the colors automatically (as I loop
through var, it grabs col=all.colors[which(names(my.data) %in% var)].
I am wondering if it's possible to do the same for the legend? Because
I just want the legend to have the same colors as in the graph... (in
real life I'll have a lot of colors and it'll be hard to enter them
all manually).

Thanks a lot!
Dimitri



On Tue, Oct 5, 2010 at 12:31 AM, Thomas Stewart <tgstewart at gmail.com> wrote:
> 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 at 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 at 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.
>
>



-- 
Dimitri Liakhovitski
Ninah Consulting
www.ninah.com



More information about the R-help mailing list