Pablo Fleurquin
Pablo Fleurquin

Reputation: 371

R lattice bwplot: Fill boxplots with specific color depending on factor level

I have this dataframe as an example:

>mydata <- rbind(data.frame(Col1 = rnorm(2*1000),Col2 =rep(c("A", "C"), each=1000),Col3=factor(rep(c("YY","NN"), 1000))),data.frame(Col1 = rnorm(1000),Col2 =rep(c("B")),Col3=factor(rep(c("YY","YN"), 500))))

That looks like:

>head(mydata)
        Col1 Col2 Col3
1 -0.1213684    A   YY
2  0.1846364    A   NN
3  0.4028003    A   YY
4  1.4065677    A   NN
5 -0.8669333    A   YY
6  0.3295806    A   NN

Being Col3 of factor type with 3 levels: NN YY YN

I want to make a boxplot using lattice bwplot and assign to each level a specific color:

# NN:
red=rgb(249/255, 21/255, 47/255)
# YN:
amber=rgb(255/255, 126/255, 0/255)
# YY:
green=rgb(39/255, 232/255, 51/255)

Using bwplot function:

pl<-bwplot(mydata$Col1~mydata$Col3 | mydata$Col2,data=mydata,
ylab=expression(italic(R)),panel=function(...)
{panel.bwplot(...,groups=mydata$Col3, fill=c(red,amber,green))})

That results in the following Figure: Example

Clearly colors are not related to the levels in my dataframe as YY box is not always green. Is there a way to assign YY:green, NN:red and YN:amber?

Upvotes: 5

Views: 2734

Answers (1)

Josh O&#39;Brien
Josh O&#39;Brien

Reputation: 162321

Here is what I'd do:

## Create a named vector of fill colors
red   <- rgb(249/255, 21/255, 47/255) # NN:
amber <- rgb(255/255, 126/255, 0/255) # YN:
green <- rgb(39/255, 232/255, 51/255) # YY:
fillCols <- c(NN=red, YN=amber, YY=green)

## Create a panel function that, with access to the subset of points plotted
## in the current panel, picks out the levels/colors that will be needed
myPanel.bwplot <- function(x=x, y=y, ...) {
    fill <- fillCols[intersect(levels(x), unique(x))] 
    panel.bwplot(x=x, y=y, ..., groups=Col3, fill=fill)
}

## Plot away
bwplot(Col1 ~ Col3 | Col2, data = mydata, panel = myPanel.bwplot)

enter image description here

Upvotes: 7

Related Questions