*Kickstarting* R - Plotting more than one data series

## Adding points or lines to a plot

If you only want to overlay data series on the same axes, it is sufficient to
specify that you don't want to "erase" the first plot and suppress display of
the axes after the first plot:

> plot(6:25,rnorm(20),type="b",xlim=c(1,30),ylim=c(-2.5,2.5),col=2)
> par(new=T)
> plot(rnorm(30),type="b",axes=F,col=3)
> par(new=F)

Notice how extra space was left in case the second series had a greater range
than the first. The example also shows how to "line up" the series if they
don't have the same x range by specifying an explicit X range in the first
plot.

If you only want to add series of points/lines that have the same x and y
ranges, `points()`

or `lines()`

will do the job

> plot(rnorm(100),type="l",col=2)
> lines(rnorm(100),col=3)

If the first data series plotted has a smaller range than subsequent ones, you
will have to include a `ylim=`

argument on the first plot to fit them
all in:

> yrange<-range(c(datavector1,datavector2,datavector3))
> plot(datavector1,type="l",ylim=yrange,col=2)
> lines(datavector2,type="l",col=3)
> ...

## Dual ordinates

Illustrating the relationship between two things on a plot is a common task.
Typically, the abcissa represents time, and the two sets of points (or lines)
show some sort of covariation. The trick is getting things lined up so that the
relationship between the variables is easy to see. Using artificial data this
time, we'll set up two variables that increase and decrease with successive
observations. In this case, the two data series have different x and y ranges.

> upvar<-rnorm(10)+seq(1,1.9,by=0.1)
> downvar<-rnorm(20)*5+19:10
> par(mar=c(5,4,4,4))
> plot(6:15,upvar,pch=1,col=3,xlim=c(1,20),xlab="Occasion",ylab="",main="Dual ordinate plot")
> mtext("upvar",side=2,line=2,col=3)

That's the first plot, with green circles showing the data points and a green
label on the y axis to identify the ordinate for them. The call to
`par()`

adds space for two extra lines on the right side of the plot,
which we'll need for the ticks and labels.

> abline(lm(upvar~I(1:10)),col=3)

The `I()`

term in the formula is necessary to prevent
`lm()`

from generating an error. Now we've got a plot with green
circles and a green line showing the regression of `upvar`

on
observation index.

> par(new=T)
> plot(downvar,axes=F,xlab="",ylab="",pch=2,col=4)
> axis(side=4)
> abline(lm(downvar~I(1:20)),col=4)
> mtext("downvar",side=4,line=2,col=4)

First, there's another call to `par()`

that allows us to plot the
second set of data without erasing the first plot. The second plot is without
axes and labels, so that they don't get mixed up with the first plot. After
adding the second axis on the right side and plotting the regression line for
`downvar`

, `mtext()`

is used to put the variable name next
to the right ordinate. Because we overlaid a new plot, we didn't have to use
`ylim=`

to fit the two ranges together.
`xlim=`

was used to line up the occasions correctly.

For more information, see __An Introduction to R__: High level plotting
commands.

Back to Table of Contents