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

Dimitri Liakhovitski dimitri.liakhovitski at gmail.com
Tue Oct 5 17:11:42 CEST 2010


THanks a lot, Thomas - I am 100% clear on the legend symbol now, very helpful.

With legend colors - I just tried to have more colors in all.colors
than there are variables to plot on the graph. Did it on purpose - so
that there are always more colors to pick from.
But if I do names(my.data) - then I also get a symbol in the legend
for something that is not on the graph (e.g., data).

Dimitri


On Tue, Oct 5, 2010 at 10:52 AM, Thomas Stewart <tgstewart at gmail.com> wrote:
> Dimitri-
> Regarding question 1, it is the pch argument that controls the legend
> symbol.  In my configuration, pch=15 gives a colored, filled-in box.  To see
> the possible pch symbols, run the following code:
> plot(0,0,xlim=c(0,9), ylim=c(0,9),type="n", axes=F,xlab="",ylab="")
> for(i in 0:9){
> for(j in 0:9){
> points(j,9-i,pch=10*i+j,cex=2)
> }
> }
> axis(3,at=0:9)
> axis(2,at=0:9,label=9:0)
> Then pick the number that corresponds to the filled-in box.
> Regarding question 2, it appears (I haven't gone line by line through your
> code.) that each color in the vector all.colors corresponds to a column in
> my.data.  If that is the case, then let the legend code be:
> legend(par()$usr[2],
>   mean(par()$usr[3:4]),
>   names(my.data),
>   xpd=T,
>   bty="n",
>   pch=15,
>   col=all.colors)
> Hope that helps.
> -tgs
>
> On Tue, Oct 5, 2010 at 10:33 AM, Dimitri Liakhovitski
> <dimitri.liakhovitski at gmail.com> wrote:
>>
>> 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
>
>



-- 
Dimitri Liakhovitski
Ninah Consulting
www.ninah.com



More information about the R-help mailing list