[R] [Fwd: Re: Plotting log-axis with the exponential base to

Peter Ehlers ehlers at ucalgary.ca
Tue May 11 20:27:37 CEST 2010


Ted,

Regarding the addition of a 'line' to a plot with log-y axis,
there is a better way: curve() with 'add=TRUE' will respect
the current plot's log setting:

     plot((1:10), log="y", yaxt="n")
     axis(side=2, at=c(1,2,5,10))
     f <- function(x, a=0, b=1) {a + b*x}
     curve(f, add = TRUE)

  -Peter

On 2010-05-11 4:52, (Ted Harding) wrote:
> Elisabeth and I have been corresponding off-list about this, and
> came to a potential solution which is on the lines also outlined
> by Mark Difford.
>
> Where Elisabeth (rather, her tutor) may have become confused may
> lie in the fact that, with a simple plot(...,log="y"), R will
> (by default) make its own decision about what numbers (in the raw
> scale) to put on the Y-axis as annotations. These will be "nice"
> (or, in R-doc-language, "pretty") numbers favouring simple multiples
> and submultiples of powers of 10. That may be why the plot gave the
> impression of being ""a logaritmic axis with the base of 10".
>
> The solution, as Elisabeth and I (and later Mark) came to was to
> suppress the Y-axis in the first instance when using plot(),
> thus plot(...,log="y",yaxt="n"). Then you add the annotation
> you want ("custom Y-axis") using the axis() function. The example
> we came to as paradigm was:
>
>    set.seed(54321)
>    Y<- 70*runif(100)
>    pwrs2<-2^((floor(log2(min(Y))):ceiling(log2(max(Y)))))
> ##[1]   0.5   1.0   2.0   4.0   8.0  16.0  32.0  64.0 128.0
> ##as.character(pwrs2) =
> ##[1] "0.5" "1"   "2"   "4"   "8"   "16"  "32"  "64"  "128"
>
>    plot(Y,log="y",yaxt="n",ylim=c(min(pwrs2),max(pwrs2)))
>
>    axis(side=2,at=pwrs2,labels=as.character(pwrs2),las=1)
>
> It is looking as though this will be the basis for a successful
> solution in Elisabeth's real application.
>
> However, there is another little "trap" lurking in there, best
> illustrated by Mark's dataset:
>
>    plot((1:10), log="y", yaxt="n")
>    axis(side=2, at=c(1,2,5,10))
>
> Here the data are X=(1:10), Y=(1:10), i.e. a straight line Y=X
> in the raw (X,Y) plane. No purer candidate for a regression line
> could be imagined. So let us try to add the regression to the plot.
> Since it joins (0,0) to (10,10), let's try (after the above plot
> commands):
>
>    lines(c(1,10),c(1,10))
>
> Well, this has taken the points (1,1) and (10,10) on the plot,
> with the Y-axis duly scaled logarithmically, and joined them.
> But what it has joined them with is a straight line on the
> logarithmic plot itself. I.e. it has not computed intermediate
> points on a logarithmic scale. Therefore, as a logarithmic
> representation of the straight-line regression Y=X, it is false!
>
> One solution is to construct it explicitly over the intermediate
> points:
>
>    lines(0.1*(10:100),0.1*(10:100))
>
> so that now each intermediate point has its Y-coordinate log
> transformed, and the straight-line segments on the graph will
> now approximate to the logarithmic curve that one wanted in the
> first place.
>
> I don't know of another way to do this: for instance, log="y" will
> not work with lines(), since '"log" is not a graphical parameter'.
>
> Ted.
>
> --------------------------------------------------------------------
> E-Mail: (Ted Harding)<Ted.Harding at manchester.ac.uk>
> Fax-to-email: +44 (0)870 094 0861
> Date: 11-May-10                                       Time: 11:52:30
> ------------------------------ XFMail ------------------------------
>
> ______________________________________________
> R-help at 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.
>
>



More information about the R-help mailing list