[Rd] bug in plot.table(..., log='y')?
John Fox
j|ox @end|ng |rom mcm@@ter@c@
Tue May 31 14:29:37 CEST 2022
Dear Martin and Bill,
If I understand correctly, the basicPowerAxis() or bcPowerAxis() (for
Box-Cox transformations) in the car package do what you describe,
treating log (to any base) as a "0th" power and making provision for a
"start," such as 1. There are also functions for two families of
power-like transformations (Hawkins-Weisberg and Yeo-Johnson) that
handle 0 and negative values naturally.
I hope this helps,
John
On 2022-05-31 6:13 a.m., Martin Maechler wrote:
>>>>>> 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
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
--
John Fox, Professor Emeritus
McMaster University
Hamilton, Ontario, Canada
web: https://socialsciences.mcmaster.ca/jfox/
More information about the R-devel
mailing list