[Rd] bug in plot.table(..., log='y')?
Martin Maechler
m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Tue May 31 12:13:07 CEST 2022
>>>>> Bill Dunlap
>>>>> on Mon, 30 May 2022 09:38:45 -0700 writes:
> Martin wrote
> If you have a table with 0 counts and think you'd prefer
> log="y" --- something I strongly agree is often a good idea,
> giving much more useful plots ---
> I'd consider in this case using the good old
> log( 1+ y )
> or log( eps+ y ) trick.
> One could also sqrt(y), which helps stabilize the variances of count data.
Definitely, thank you, Bill!
What I mean above (and I think you understood, but probably not
many other readers because I was too terse),
was of course to use log="y" with the "+ eps" trick,
i.e., {in a general situation}
plot(x, y+eps, log="y")
so the labels show numbers on the y+eps scale, and for smallish
eps, this is visually the same as y-scale - unless you are close to y=0.
> Making nicely spaced and labelled tick marks for these transformations can
> be a pain. Perhaps some package already does this.
> -Bill
Not used yet, but from documentation, Stahel's 'plgraphics'
package (see bottom below), does allow "arbitrary" transformation.
For the specific case of table() {or xtable()} results with true counts,
I agree it would be nice to have something like 'sqrt="y"' or
just 'sqrt=TRUE' which would "show" sqrt(<count>) but label the
axis non-equidistantly with counts.
A bit like
y <- sort(rlnorm(333, 3))
plot(qnorm(ppoints(y)), y, log="y", yaxt="n")
sfsmisc::eaxis(2, sub=1)
does for log-transformed.
The simple traditional-graphics plot(*, log="y") is often
good enough, but I like to see from the ticks that there was a
transformation.
Martin
> On Mon, May 30, 2022 at 3:41 AM Martin Maechler <maechler using stat.math.ethz.ch>
> wrote:
>> >>>>> Spencer Graves
>> >>>>> on Sat, 28 May 2022 11:41:49 -0500 writes:
>>
>> > On 5/28/22 11:23 AM, Duncan Murdoch wrote:
>> >> On 28/05/2022 11:33 a.m., Spencer Graves wrote:
>> >>> Dear R Developers:
>> >>>
>> >>>
>> >>> Consider the following example:
>> >>>
>> >>>
>> >>> (tstTable <- table(rep(1:3, 3:1))) plot(tstTable)
>> >>> plot(tstTable, log='y')
>> >>>
>> >>>
>> >>> "plot(tstTable)" works as expected.
>> >>> "plot(tstTable, log='y')" gives a warning:
>> >>>
>> >>>
>> >>> Warning message: In plot.window(...) : nonfinite
>> >>> axis=2 limits [GScale(-inf,0.477121,..); log=TRUE] --
>> >>> corrected now
>> >>>
>> >>>
>> >>> AND the plot has a y axis scale running from
>> >>> 1e-307 to 1e+13.
>> >>>
>> >>>
>> >>> This is with R 4.2.0 (R Console and the current
>> >>> RStudio) under macOS 11.6.6.
>> >>>
>> >>>
>> >>> "plot(as.numeric(names(tstTable),
>> >>> as.numeric(tstTable), log='y'))" works as expected ;-)
>> >>>
>> >>>
>> >>> Comments? Thanks for your valuable work in
>> >>> making it easier for people everywhere to do quality
>> >>> statistics.
>> >>
>> >> The help page ?plot.table says that ylim defaults to c(0,
>> >> max(x)), i.e. c(0,3) in your example. If you're asking
>> >> to plot that on a log scale, there are bound to be
>> >> problems.
>> >>
>> >> If you specify ylim, e.g. as c(min(tstTable),
>> >> max(tstTable)), things are fine in your example; they
>> >> won't be in examples where the min is zero.
>> >>
>> >> Duncan Murdoch
>>
>> > Thanks. I looked at the help file but didn't read it
>> > carefully enough.
>>
>> > Spencer
>>
>> If you have a table with 0 counts and think you'd prefer
>> log="y" --- something I strongly agree is often a good idea,
>> giving much more useful plots ---
>>
>> I'd consider in this case using the good old
>> log( 1+ y )
>> or log( eps+ y ) trick.
>>
>> My colleague Werner Stahel has spent quite a bit of effort in
>> order to make such "log-transformed plots in case of {zero etc}"
>> plot even smarter and convenient...
>> and has put this (and many more related ideas of doing smart and
>> robust good data analysis) in his package 'plgraphics'
>> (on R-forge, but still not on CRAN unfortunately).
>> With many thanks to Ian Howson, still nicely available also here:
>>
>> https://rdrr.io/rforge/plgraphics/
>>
>> His generalized log(1 + y) is plgraphics::logst(),
>> documented on the rdrr mirror here
>> https://rdrr.io/rforge/plgraphics/man/logst.html
>>
>> Martin
More information about the R-devel
mailing list