[R] contour(): lines & labels in different colours?
David Winsemius
dwinsemius at comcast.net
Mon Nov 23 02:24:36 CET 2009
On Nov 22, 2009, at 8:01 PM, Duncan Murdoch wrote:
> On 22/11/2009 6:28 PM, (Ted Harding) wrote:
>> Wow! (Top-posting for once, since there's no natural other place ...)
>> Thanks Peter, David and Duuncan for the suggestions. I'll look at the
>> later ones from David & Duncan later (it's getting late here).
>> However, as something to work on if you want to, here is a toy
>> example, based on the same overall methodology as I'm using for
>> my real plot (though the real one looks quite different):
>> #############
>> library(MASS)
>> set.seed(54321)
>> X <- rnorm(100) ; Y <- rnorm(100)
>> h0 <- 2.0
>> W <- kde2d(x=X,y=Y,n=100,h=c(h0,h0),lims=c(-3,3,-3,3))
>> Wmax <- max(W$z)
>> W$z <- 10*(W$z/Wmax)
>> Palette <- colorRampPalette(c("lightgreen","red"),
>> interpolate="spline" )
>> Levels <- (1.0*(0:10))
>> filled.contour(x=W$x,y=W$y,z=W$z,levels=Levels,
>> xlim=c(-3,3),ylim=c(-3,3),
>> color.palette=Palette,
>> plot.axes={axis(1);axis(2);points(X,Y,pch="+",col="blue");
>> points(X,Y,pch="+",col="blue");
>> contour(x=W$x,y=W$y,z=W$z,levels=Levels,labcex=1.5,
>> col="red",add=TRUE, labels=" ", method="flattest"
>> );
>> contour(x=W$x,y=W$y,z=W$z,levels=Levels,labcex=1.5,
>> lty=0,col="black",add=TRUE, method="flattest"
>> );
>> }
>> )
>> #############
>> I've incorporated here the first two suggestiong from Peter and
>> David, though not (yet) any of the later ones. One thing that emerges
>> is that the two contour() plots don't quite match up as to where
>> (or whether) the space from 'labels=" "' in the first are made,
>> and the placing of the labels in the second.
>> I'll try the other suggestions and see what happens -- but I may
>> end up doing the first plot (red) without labels, so that there's
>> no break in the contours. Better, I think, to have the black labels
>> simply stuck onto the red contours, than have some of them misaligned
>> with bvreaks in the contours.
>
> Here's a version of the last one I posted:
>
> filled.contour(x=W$x,y=W$y,z=W$z,levels=Levels,
> xlim=c(-3,3),ylim=c(-3,3),
> color.palette=Palette,
> plot.axes={axis(1);axis(2);points(X,Y,pch="+",col="blue");
> points(X,Y,pch="+",col="blue");
> reps <- round(strwidth(Levels, cex=1.5) / strwidth(" ",
> cex=1.5))
> spaces <- sapply(reps, function(x) paste(rep(" ", round(x)),
> collapse=""))
> contour(x=W$x,y=W$y,z=W$z,labels=spaces,levels=Levels,labcex=1.5,
> col="red",add=TRUE, method="flattest",
> drawlabels=TRUE
> );
> contour(x=W$x,y=W$y,z=W$z,levels=Levels,labcex=1.5,
> lty=0,col="black",add=TRUE, method="flattest"
> );
> }
> )
>
I thought the code was good, although there is a duplicated points ()
call, but the offered colorPallete would be improved by going to
lightyellow to blue and the points to orange. Also got "bold" labels
to work. Still takes a bit of experimentation with the width of the
space string when you vary the number of points for some reason:
library(MASS)
set.seed(54321)
X <- rnorm(500) ; Y <- rnorm(500)
h0 <- 2.0
W <- kde2d(x=X,y=Y,n=100,h=c(h0,h0),lims=c(-3,3,-3,3))
Wmax <- max(W$z)
W$z <- 10*(W$z/Wmax)
Palette <- colorRampPalette(c("lightyellow","blue"),
interpolate="spline" )
Levels <- (1.0*(0:10))
filled.contour(x=W$x,y=W$y,z=W$z,levels=Levels,
xlim=c(-3,3),ylim=c(-3,3),
color.palette=Palette,
plot.axes={axis(1);axis(2);
points(X,Y,pch="+",col="orange", cex=.8);
contour(x=W$x,y=W$y,z=W$z,levels=Levels,labcex=1.5,
col="red",add=TRUE, labels=" ", method="flattest"
);
contour(x=W$x,y=W$y,z=W$z,levels=Levels,labcex=1.5,
lty=0,col="black",vfont=c("sans serif", "bold"),
add=TRUE, method="flattest"
);
}
)
> Duncan Murdoch
>
>> Thank you all!
>> Ted.
>> On 22-Nov-09 22:53:03, David Winsemius wrote:
>>> On Nov 22, 2009, at 5:35 PM, Duncan Murdoch wrote:
>>>
>>>> On 22/11/2009 5:21 PM, David Winsemius wrote:
>>>>> On Nov 22, 2009, at 4:57 PM, Peter Ehlers wrote:
>>>>>> Hi Ted,
>>>>>>
>>>>>> This won't solve your problem, but a small improvement might
>>>>>> be to place the labels over the lines rather than the other
>>>>>> way around. It will definitely avoid putting red lines over
>>>>>> black ones:
>>>>>>
>>>>>> x <- -6:16
>>>>>> z <- outer(x,x)
>>>>>> contour(z, labels="", col=2)
>>>>>> contour(z, lty=0, labcex=1, add=TRUE)
>>>>> I played around a bit with you example, and can get almost the
>>>>> desired color and lack of cutting through labels. There is the
>>>>> possibility of plotting empty labels that create a space in
>>>>> the curves for the later labels-without-lines overlay:
>>>>> x <- -6:16
>>>>> z <- outer(x,x)
>>>>> contour(z, labels=" ", col=2, labcex=1.5, drawlabels=TRUE)
>>>>> contour(z, lty=0, labcex=1.5, add=TRUE)
>>>> That's a nice solution. You could probably do a bit better in a
>>>> couple of steps: 1st, figure out what the level labels will be
>>>> (by default, pretty(range(z, finite=TRUE), 10) ), then compute
>>>> an equivalent number of spaces, e.g.
>>>>
>>>> levels <- pretty(range(z, finite=TRUE), 10)
>>>> strwidth(levels, cex=1.5) / strwidth(" ", cex=0.5)
>>>>
>>>> Then use the appropriate number of spaces as the labels in the
>>>> first plot, and the numbers in the second one. Do we have a
>>>> simple function to take input like c(10, 12) and produce two
>>>> character strings containing 10 and 12 spaces?
>>>>
>>> Not sure it is "simple" but this (after more playing around) did
>>> the trick:
>>>
>>> library(R.oo)
>>> vecspaces <- function(n) sapply(n, function(x)
>>> paste(rep(intToChar(32), x), sep="", collapse="") )
>>>
>>>
>>> > vecspaces(c(10,12) )
>>> [1] " " " "
>>>
>>> > vecspaces(1:10)
>>> [1] " " " " " " " " "
>>> " " " " "
>>> [8] " " " " " "
>>>
>>> --
>>> David
>>>
>>>> Duncan Murdoch
>>>>
>>>>>> Cheers,
>>>>>> Peter
>>>>>>
>>>>>>
>>>>>> (Ted Harding) wrote:
>>>>>>> Greetings, All!
>>>>>>> I want to draw contour lines in red, using contour(), but also
>>>>>>> have the contour labels (for the level-values) in black so that
>>>>>>> they will stand out against a coloured background already
>>>>>>> generated
>>>>>>> using filled.contour() (the background shades from green at low
>>>>>>> levels of "risk" to red at high levels).
>>>>>>> In any case, contour labels in red are already somewhat
>>>>>>> inconspicuous
>>>>>>> with contour lines in red, regardless of background.
>>>>>>> I see nothing in ?contour nor in ?par about this.
>>>>>>> One way to approach it could be to first draw the labelled
>>>>>>> contours
>>>>>>> in black, and then overlay by re-drawing (with out labels) in
>>>>>>> red.
>>>>>>> This would sort-of work, but the red contour lines would then
>>>>>>> cut
>>>>>>> through the black numbers, which is somewhat undesirable. Also
>>>>>>> (I've tried it) you can get show-through along the contour lines
>>>>>>> from the black layer, which is nasty.
>>>>>>> Any suggestions?
>>>>>>> With thanks,
>>>>>>> Ted.
>>>>>>> --------------------------------------------------------------------
>>>>>>> E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
>>>>>>> Fax-to-email: +44 (0)870 094 0861
>>>>>>> Date: 22-Nov-09 Time:
>>>>>>> 17:06:08
>>>>>>> ------------------------------ 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.
>>>>>>>
>>>>>> ______________________________________________
>>>>>> 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.
>>>>> David Winsemius, MD
>>>>> Heritage Laboratories
>>>>> West Hartford, CT
>>>>> ______________________________________________
>>>>> 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.
>>> David Winsemius, MD
>>> Heritage Laboratories
>>> West Hartford, CT
>>>
>> --------------------------------------------------------------------
>> E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
>> Fax-to-email: +44 (0)870 094 0861
>> Date: 22-Nov-09 Time: 23:28:19
>> ------------------------------ 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.
>
David Winsemius, MD
Heritage Laboratories
West Hartford, CT
More information about the R-help
mailing list