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 at 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 at 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/