[R] conditional assignment of colors in xyplot()

Deepayan Sarkar deepayan.sarkar at gmail.com
Thu Sep 30 14:21:10 CEST 2010


On Mon, Sep 27, 2010 at 7:11 AM, nathan pellegrin
<nathan.pellegrin at gmail.com> wrote:
> # Dear R Community,
>
> # I have this data frame:
>
> df1 <- data.frame(
>        F1 = factor( c( rep("D1",12),rep("D2",12),rep("D3",12) ) ),
>        F2 = factor( rep( rep( paste("O",1:6,sep=""), rep(2,6) ), 3) ),
>        F3 = factor( rep( c("V1","V2"), 18 ) ),
>        S1 =
> c(8.840955e-02,2.546822e-01,7.562658e-01,8.801181e-01,6.041766e-02,2.172731e-01,6.542187e-98,
> 7.067840e-04,1.430933e-01,9.764401e-01,1.380848e-05,1.192620e-01,9.107259e-01,1.235232e-01,
> 3.021847e-01,1.331351e-01,5.272103e-01,3.663577e-01,1.539690e-38,2.224451e-01,2.873052e-01,
> 5.110313e-01,7.840802e-01,8.210762e-10,1.553356e-01,4.173335e-01,5.964021e-01,4.955694e-01,
> 8.849240e-02,5.739598e-01,1.879075e-17,1.071003e-03,7.298928e-01,6.347287e-01,8.884034e-01,
> 4.460295e-11),
>        S2 =
> c(1.32249139,1.02831831,-0.09650252,-0.05454486,2.62105492,2.00310250,8.07269064,
> -1.55397883,1.77390551,0.04161954,7.14188540,-2.98033713,-0.49904251,-0.74309058,
> -0.49904251,-0.74309058,1.22492623,-1.79003492,7.60003121,-0.74549596,2.53418936,
> -1.60112296,0.67131380,-15.31744351,-0.18380339,0.28628435,-0.18380339,0.28628435,
> 2.96108998,1.18267783,5.78419118,2.70861763,0.66287857,1.10397741,0.27160971,
> -15.37506924) )
>
>
> # Two of the factors are used to define an array
> # of panels with the third showing up as bars along the x axis.
> # How do I color the bars according to their sign (red < 0, blue > 0)
> # conditional on the value of S2 < .025 - in which case color them gray?
> # Initially, I tried to pass a character vector specifying colors,
> # which does not achieve the desired result:
>
> library(lattice)
> library(latticeExtra)
>
> df1$barcols <- ifelse(df1$S1 <.025, "gray", ifelse( df1$S2 > 0,
> "blue","red"))
>
>  ctp <- xyplot(S2 ~ F2 | F1 + F3,
>              data=df1, as.table=TRUE, ylim=c(-10,10),
>                panel = function(x,y){
>                      panel.barchart(x,y,horizontal=FALSE, origin=0,
>                          col=df1$barcols ) } )
> useOuterStrips(ctp)
>
> # Any help you can provide would be greatly appreciated.
> # Thank you!

Itis better to keep the idea of grouping and the actual colors distinct.

df1 <-
    transform(df1,
              colgrp = factor(ifelse(S1 <.025, "A",
                                     ifelse( df1$S2 > 0, "B", "C")),
                              levels = c("A", "B", "C")))

barchart(S2 ~ F2 | F1 + F3, stack = TRUE,
         data=df1, as.table=TRUE, ylim=c(-10,10),
         groups = colgrp,
         par.settings = simpleTheme(col = c("grey", "blue", "red")))

-Deepayan



More information about the R-help mailing list