[R] Plotting multiple time series with variables having different units

Jim Lemon jim at bitwrit.com.au
Sun Feb 2 22:59:48 CET 2014


On 02/03/2014 06:09 AM, David Parkhurst wrote:
> I've tried to figure out how to do this from what I read, but haven't
> been successful. Suppose I have a dataframe with variables Date, X, and
> Y (and maybe U, V, and Z) where X, Y, etc. have different units. I'd
> like to plot Y vs. Time above X vs. Time, above one another.
>
> For example, X is the number of gulls counted on a reservoir, and Y is
> the number of coliform bacteria counted on a petri plate from a water
> sample leaving the reservoir, so these have very different ranges. U and
> V might be numbers of geese and numbers of ducks counted on the same days.
>
> What commands would I use to create such a set of plots?

Hi David,
If you did want dual axes, rather than leave you sitting there with your 
boss saying, "Why don't you just use Excel, David?", I'll give a couple 
of methods.

One of the bazillion ways mentioned is the twoord.plot function in the 
plotrix package. I'm currently working on a way to make it easier to 
separate the different values, so I'll give a detailed example. This 
example was inspired by my good fortune some years ago to have the use 
of an outdoor pool at work in which I swam each morning. There were a 
lot of ducks that liked the pool, too.

pool_obs<-paste(1,1:12,2007,sep="/")
n_ducks<-c(8,5,6,7,3,2,4,5,6,9,8,7)
duck_splotches<-c(22,28,23,18,21,19,15,11,12,14,12,16)
duck_pool<-data.frame(pool_obs,n_ducks,duck_splotches)
duck_pool$pool_obs<-as.Date(duck_pool$pool_obs,"%d/%m/%Y")
# the easy way
library(plotrix)
twoord.plot("pool_obs","n_ducks","pool_obs","duck_splotches",
  duck_pool,
  ylab="Number of ducks observed",
  rylab="Number of duck splotches in pool",
  xlab="Date",lylim=c(0,30),rylim=c(0,30),
  xtickpos=duck_pool$pool_obs,
  xticklab=month.abb,
  main="Duck splotch throughout the year")

You can separate the two series like this:

axis.break(2,10,style="gap")

You can do what I am presently doing to twoord.plot like this:

plot(duck_pool$pool_obs,duck_pool$duck_splotches,ylim=c(0,30),
  axes=FALSE,ylab="Number of duck splotches in pool",xlab="Date",
  main="Duck splotch throughout the year",type="b")
staxlab(1,at=duck_pool$pool_obs,labels=month.abb)
axis(2,at=seq(10,30,by=5))
box()
points(duck_pool$pool_obs,duck_pool$n_ducks,
  type="b",pch=2,col="red")
axis(4,at=seq(0,10,by=5),col="red")
mtext("Number of ducks observed",side=4,at=6,line=2,col="red")

and of course you can stick in the axis break if you like. You can also 
fiddle the values and the two axes so that the two series don't overlap 
on the plot even if they do numerically. There is the possibility of 
just putting two plots one above the other if you really don't want the 
two series on the same plot.

Jim




More information about the R-help mailing list