Hi everyone, Is there any reason why we should not automatically coerce a factor supplied as an argument to col in a plotting function? The following modification (to R-1.6.1) seems pretty harmless> plot.xyfunction (xy, type, pch = 1, lty = "solid", col = par("fg"), bg = NA, cex = 1, ...) { if (is.factor(col)) col <- codes(col) .Internal(plot.xy(xy, type, pch, lty, col, bg, cex, ...)) } <environment: namespace:base> and I think it is natural and not really wrong to want to type, say,> data(iris) > pairs(iris[, 1:4], col = iris[, 5])and get the colours. Cheers, Jonathan. -- Jonathan Rougier Science Laboratories Department of Mathematical Sciences South Road University of Durham Durham DH1 3LE tel: +44 (0)191 374 2361, fax: +44 (0)191 374 7388 http://www.maths.dur.ac.uk/stats/people/jcr/jcr.html
Jonathan Rougier <J.C.Rougier@durham.ac.uk> writes:> Hi everyone, > > Is there any reason why we should not automatically coerce a factor > supplied as an argument to col in a plotting function? The following > modification (to R-1.6.1) seems pretty harmless > > > plot.xy > function (xy, type, pch = 1, lty = "solid", col = par("fg"), > bg = NA, cex = 1, ...) > { > if (is.factor(col)) > col <- codes(col) > .Internal(plot.xy(xy, type, pch, lty, col, bg, cex, ...)) > } > <environment: namespace:base> > > and I think it is natural and not really wrong to want to type, say, > > > data(iris) > > pairs(iris[, 1:4], col = iris[, 5]) > > and get the colours.It's not clear to me that you want codes() there. Consider f <-factor(c("red","blue","green")) plot(1:3,col=codes(f)) which get coloured green, black, and red. Arguably better than to drop codes() and get black, black, and black, but not by much. Alternatives could be as.numeric() or as.character(), but it all gets a bit arbitrary. I think I prefer the explicit style in any case clr <- sort(c("red","blue","green")) plot(1:3,col=clr[f]) (beware the ordering of levels in f) -- O__ ---- Peter Dalgaard Blegdamsvej 3 c/ /'_ --- Dept. of Biostatistics 2200 Cph. N (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk) FAX: (+45) 35327907
*Not* codes! Unclass perhaps. However, why should col=factor(c("red", "blue", "green")) not as naturally coerce to character. I think we do need to get the user to specify what is meant, as now. There are lots of examples of this sort of thing in MASS, BTW. On Fri, 22 Nov 2002, Jonathan Rougier wrote:> Hi everyone, > > Is there any reason why we should not automatically coerce a factor > supplied as an argument to col in a plotting function? The following > modification (to R-1.6.1) seems pretty harmless > > > plot.xy > function (xy, type, pch = 1, lty = "solid", col = par("fg"), > bg = NA, cex = 1, ...) > { > if (is.factor(col)) > col <- codes(col) > .Internal(plot.xy(xy, type, pch, lty, col, bg, cex, ...)) > } > <environment: namespace:base> > > and I think it is natural and not really wrong to want to type, say, > > > data(iris) > > pairs(iris[, 1:4], col = iris[, 5]) > > and get the colours. > > Cheers, Jonathan. > > -- > Jonathan Rougier Science Laboratories > Department of Mathematical Sciences South Road > University of Durham Durham DH1 3LE > tel: +44 (0)191 374 2361, fax: +44 (0)191 374 7388 > http://www.maths.dur.ac.uk/stats/people/jcr/jcr.html > > ______________________________________________ > R-devel@stat.math.ethz.ch mailing list > http://www.stat.math.ethz.ch/mailman/listinfo/r-devel >-- Brian D. Ripley, ripley@stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595
OK -- so there are two objections to the proposal: 1) The factor might be a colour specifier 2) Using codes is not a good idea because there are only 8 colours available for an integer argument to col. I can see that both of these have merit, but I think they are both easy to work around, if necessary. No-one has disagreed that it's natural to want to pass a factor to col, and I believe that the vast majority of times when this occurs the factor is not designed explicitly to paint the points. I think I would let the first objection pass. Using codes to coerce the factor we still get different colours for different factors, just not the specified colours. This is not right, but it's rarely a disaster either and should be easy to spot for anyone who is expecting to see "slateblue" and gets "red". As for the second objection, I think this is valid and should be addressed, but at the same time it is a different problem. I often wondered why col = 1 was black (not really a colour at all, and not very good for boxplots) and, more pertinently, why col = 2 is red and col = 3 is green: isn't the most common form of colour-blindness red/green? At the very least, let's not have them next to each other in the list! We have 657 named colours to choose from: why not have a explicit "int2col" function that provides a bigger and better table? More-or-less the same arguments also apply to pch. Jonathan. Jonathan Rougier wrote:> > Hi everyone, > > Is there any reason why we should not automatically coerce a factor > supplied as an argument to col in a plotting function? The following > modification (to R-1.6.1) seems pretty harmless > > > plot.xy > function (xy, type, pch = 1, lty = "solid", col = par("fg"), > bg = NA, cex = 1, ...) > { > if (is.factor(col)) > col <- codes(col) > .Internal(plot.xy(xy, type, pch, lty, col, bg, cex, ...)) > } > <environment: namespace:base> > > and I think it is natural and not really wrong to want to type, say, > > > data(iris) > > pairs(iris[, 1:4], col = iris[, 5]) > > and get the colours. > > Cheers, Jonathan. > > -- > Jonathan Rougier Science Laboratories > Department of Mathematical Sciences South Road > University of Durham Durham DH1 3LE > tel: +44 (0)191 374 2361, fax: +44 (0)191 374 7388 > http://www.maths.dur.ac.uk/stats/people/jcr/jcr.html > > ______________________________________________ > R-devel@stat.math.ethz.ch mailing list > http://www.stat.math.ethz.ch/mailman/listinfo/r-devel-- Jonathan Rougier Science Laboratories Department of Mathematical Sciences South Road University of Durham Durham DH1 3LE tel: +44 (0)191 374 2361, fax: +44 (0)191 374 7388 http://www.maths.dur.ac.uk/stats/people/jcr/jcr.html
The problem is that col= is interpreted in C code for many different R functions, not kust those going through plot.xy. The only consistent way I see to handle this is to change the common C code to handle more cases, if people really think it is worth complicating R for. I was going to point out that your previous solution was less general than what was there at present. On Mon, 25 Nov 2002, Jonathan Rougier wrote:> Hi Thomas, > > Thomas Lumley wrote: > > > > On Sat, 23 Nov 2002, Jonathan Rougier wrote: > > > > > OK -- so there are two objections to the proposal: > > > > > > 1) The factor might be a colour specifier > > > > > > > The function below might help > > It checks: > > - are the levels colour names > > - are they numbers > > - are they color specifiers like #a0f3d2 > > otherwise it returns the underlying codes with unclass(). > > Is there a case, given that colours *can* be represented in several > different ways, for including the two functions "is.color" and > "as.color" in the base? I imagine the latter would work like > "as.numeric", putting NA for elements that cannot be coerced to > colours. The function "as.color" might return a specific colour format, > perhaps #hhhhhh if that is the most general, which would simplify other > parts of the code. > > Jonathan. > > -- > Jonathan Rougier Science Laboratories > Department of Mathematical Sciences South Road > University of Durham Durham DH1 3LE > tel: +44 (0)191 374 2361, fax: +44 (0)191 374 7388 > http://www.maths.dur.ac.uk/stats/people/jcr/jcr.html > > ______________________________________________ > R-devel@stat.math.ethz.ch mailing list > http://www.stat.math.ethz.ch/mailman/listinfo/r-devel >-- Brian D. Ripley, ripley@stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595