[R] contour(): lines & labels in different colours?
Duncan Murdoch
murdoch at stats.uwo.ca
Mon Nov 23 02:01:46 CET 2009
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"
);
}
)
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.
More information about the R-help
mailing list