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]]