[R] plot of 2 time series with very different values

Petr Pikal petr.pikal at precheza.cz
Fri Mar 2 12:36:31 CET 2007


Hi

I use a function plot.yy which i designed for convenieant plotting on 
2 y axes for myself (see code below). You can modify its internals to 
suit your needs easily but this will give you something quite close.

plot.yy(1996:2000, c(80, 100, 95, 35, 28), c(7,8,6, 2, 3), 
xlim=c(1996, 2000),
yylab=c("Resistence","Use"), xlab="Date", pch=c(NA,NA), linky=T)

HTH
Petr

On 2 Mar 2007 at 11:54, Berta wrote:

From:           	"Berta" <ibanez at bioef.org>
To:             	<r-help at stat.math.ethz.ch>
Date sent:      	Fri, 2 Mar 2007 11:54:57 +0100
Organization:   	bioef
Subject:        	[R] plot of 2 time series with very different values

> 
> Hi R-Users,
> 
> I am trying to plot two time series in the same plot, but they measure
> different things and hence one
>  has values around 1-9 (Use=c(7,8, 6, 2, 3)), and the other one around
>  
> 20-100 (Resitance=c(80, 100, 95, 35, 28)). I have thought of plotting
> both in the same graph but with two axes, one from 1 to 9 and the
> other from 20 to 100. To do so, I needed to do a regression for
> corrsepondence (1 goes to 20 and 9 goes to 100); the code to produce
> the graph would be:
> 
> plot(1996:2000, xlim=c(1996, 2000),ylab="Resistence", ylim=c(20,100),
> type="n", xlab="Date") lines(1996:2000, c(80, 100, 95, 35, 28), col=1)
> axis(side=4, at=c(20,30,40,50,60,70,80,90,100), labels=c(1:9))
> lines(1996:2000, lsfit(c(1,9),c(20,100))$coef[1]+
> lsfit(c(1,9),c(20,100))$coef[2]*c(7,8,6, 2, 3), col=2) legend(1998.5,
> 90, legend=c("Resistence", "Use"), fill=c(1,2))
> 
> However, I suspect there are better ways to do so, and I would like to
> know one because I have to do that many times.
> 
> Thanks a lot in advance,
> 
> Berta
> 
> ______________________________________________
> R-help at stat.math.ethz.ch 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.

Here is the code, all parameters are easily understood except of 
rect, which will was designed for a plotting a rectangle and you can 
ignore it completely.

plot.yy<-function(x,yright,yleft, yleftlim=NULL, yrightlim = NULL, 
xlab = NULL ,yylab=c("",""),
pch=c(1,2),col=c(1,2), linky=F, smooth=0, lwds=1, length=10, 
format="%d/%m", rect=NULL, type="p",...)

{

par(mar=c(5,4,4,2),oma=c(0,0,0,3))

plot(x, yright, ylim=yrightlim, axes=F,ylab="", xlab=xlab, 
pch=pch[1],col=col[1], type=type, ...)
if (!is.null(rect)) rect(x[rect[1]],rect[2],cas.osa[rect[3]],rect[4], 
col="grey")
points(x, yright, ylim=yrightlim, ylab="", xlab=xlab, 
pch=pch[1],col=col[1], ...)
axis(4,pretty(range(yright,na.rm=T),10),col=col[1])

if (linky) lines(x,yright,col=col[1], ...)
if (smooth!=0) lines(supsmu(x,yright,span=smooth),col=col[1], 
lwd=lwds, ...)

if(yylab[1]=="")
mtext(deparse(substitute(yright)),side=4,outer=T,line=1, col=col[1], 
...)
else
mtext(yylab[1],side=4,outer=T,line=1, col=col[1], ...)

par(new=T)
plot(x,yleft, ylim=yleftlim, ylab="", axes=F ,xlab=xlab, 
pch=pch[2],col=col[2], ...)
box()
axis(2,pretty(range(yleft,na.rm=T),10),col=col[2], col.axis=col[2])

if (!inherits(x,c("Date","POSIXt"))) 
axis(1,pretty(range(x,na.rm=T),10)) else
{
l<-length(x)
axis(1,at=x[seq(1,l,length=length)],labels=format(as.POSIXct(x[seq(1,l
,length=length)]),format=format))
}

if(yylab[2]=="")
mtext(deparse(substitute(yleft)),side=2,line=2, col=col[2], ...)
else
mtext(yylab[2],side=2,line=2, col=col[2], ...)

if (linky) lines(x,yleft,col=col[2], lty=2, ...)
if (smooth!=0) lines(supsmu(x,yleft,span=smooth),col=col[2], lty=2, 
lwd=lwds, ...)

}
Petr Pikal
petr.pikal at precheza.cz



More information about the R-help mailing list