# [R] How to use the function "plot" as Matlab?

(Ted Harding) Ted.Harding at nessie.mcc.ac.uk
Wed Jul 13 10:12:42 CEST 2005

```On 13-Jul-05 klebyn wrote:
> Hello,
>
> How to use the function plot to produce graphs as Matlab?
> example in Matlab:
>
> a = [1,2,5,3,6,8,1,7];
> b = [1,7,2,9,2,3,4,5];
> plot(a,'b')
> hold
> plot(b,'r')
>
>
> How to make the same in R-package ?
>
> I am trying something thus:
>
> a <- c(1,2,5,3,6,8,1,7)
> c(1,7,2,9,2,3,4,5) -> b
>
> a;b
>
> plot(a,t="l",col="blue")
> plot(b,t="l",col="red")

Although this is an over-worked query -- for which an answer, given
that t="l" has been specified, is to use

plot(a,t="l",col="blue",ylim=c(0,10))
lines(b,t="l",col="red")

there is a more interesting issue associated with it (given that
Klebyn has come to it from a Matlab perspective).

It's a long time since I used real Matlab, but I'll illustrate
with octave which, in this respect, should be identical to Matlab.

Octave:

octave:1> x = 0.1*(0:20);
octave:2> plot(x,sin(x))

produces a graph of sin(x) with the y-axis scaled from 0 to 1.0
Next:

octave:3> hold on
octave:4> plot(x,1.5*cos(x))

superimposes a graph of 1.5*cos(x) with the y-axis automatically
re-scaled from -1 to 1.5.

This would not have happened in R with

x = 0.1*(0:20);
plot(x,sin(x))
lines(x,1.5*cos(x))

where the 0 to 1.0 scaling of the first plot would be kept for
the second, in which therefore part of the additional graph of
1.5*cos(x) would be "outside the box".

No doubt like many others, I've been caught on the wrong foot
by this more than a few times. The solution, of course (as
illustrated in the reply to Klebyn above) is to anticipate
what scaling you will need for all the graphs you intend to
put on the same plot, and set up the scalings at the time
of the first one using the options "xlim" and "ylim", e.g.:

x = 0.1*(0:20);
plot(x,sin(x),ylim=c(-1,1.5))
lines(x,1.5*cos(x))

This is not always feasible, and indeed should not be expected
to be feasible since part of the reason for using software
like R in the first place is to compute what you do not know!

Indeed, R will not allow you to use "xlim" or "ylim" once the
first plot has been drawn.

So in such cases I end up making a note (either on paper or,
when I do really serious planning, in auxiliary variables)
of the min's and max's for each graph, and then re-run the
plotting commands with appropriate "xlim" and "ylim" scaling
set up in the first plot so as to include all the subsequent
graphs in entirety. (Even this strategy can be defeated if
the succesive graphs represent simulations of long-tailed
distributions. Unless of course I'm sufficiently alert to
set the RNG seed first as well ... )

I'm not sufficiently acquainted with the internals of "plot"
and friends to anticipate the answer to this question; but,
anyway, the question is:

Is it feasible to include, as a parameter to "plot", "lines"
and "points",

rescale=FALSE

where this default value would maintain the existing behaviour
of these functions, while setting

rescale=TRUE

would allow each succeeding plot, adding graphs using "points"
or "lines", to be rescaled (as in Matlab/Octave) so as to
include the entirety of each successive graph?

Best wishes to all,
Ted.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at nessie.mcc.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 13-Jul-05                                       Time: 09:12:34
------------------------------ XFMail ------------------------------

```