[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