[R] ltext - adding text to each panel from a matrix

Austin, Matt maustin at amgen.com
Thu Nov 10 19:07:07 CET 2005


Haven't checked it too carefully, but how about:

bwplot(treatment~foo|group, data = dat,
       panel=function(x,y,...) {
           panel.violin(x,y, ..., col = "transparent", varwidth = F)
           gt0 <- table( x > 0, y)
           panel.abline(v=0, lty = "dotted")
           grid.text(as.character(gt0[1,]), unit(1, 'lines'), unit(1:3,
'native'), just='left')
           grid.text(as.character(gt0[2,]), unit(1, 'npc') - unit(1,
'lines'), unit(1:3, 'native'), just='left')
       },
       par.strip.text = list(cex = 0.8),  xlim = my.xlim)


--Matt

> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch
> [mailto:r-help-bounces at stat.math.ethz.ch]On Behalf Of Andy Bunn
> Sent: Thursday, November 10, 2005 8:19 AM
> To: R-Help
> Subject: [R] ltext - adding text to each panel from a matrix
> 
> 
> Hi all (really probably just Deepayan):
> 
> In the plot below I want to add text on either side of each 
> violin plot that
> indicates the number of observations that are either positive 
> or negative.
> I'm trying to do this with ltext() and I've also monkeyed about with
> panel.text(). The code below is generally what I want but my calls to
> ltext() are wrong and I'm not sure how to fix them. Right now 
> they replicate
> the first column of the matrices obs.pos and obs.neg for each 
> panel. How do
> I tell ltext to advance to the next column when the next 
> panel is plotted? I
> don't see how subscripts can do it, but I bet it's something 
> along that
> line...
> 
> Thanks, Andy
> 
> rm(list = ls())
> set.seed(354)
> # make a bimodal dataset with three groups and three treatments
> foo <- c(rnorm(150,-1,0.5), rnorm(150,1,0.25))
> treatment <- factor(rep(seq(1,3),100), labels = c("Treatment 
> 1", "Treatment
> 2", "Treatment 3"))
> group <- factor(rep(seq(1,3),100), labels = c("Group A", 
> "Group B", "Group
> C"))
> group <- sample(group)
> # corrupt Group A, Treatment 2 for fun.
> foo[group=="Group A" & treatment=="Treatment 2"][1:8] <- rnorm(8,1,1)
> dat <- data.frame(foo,treatment,group)
> 
> # set the limits for the plot, which also tells where to put the text
> my.xlim <- c(-6, 6)
> 
> # make a matrix that counts the number of obs greater or less 
> than zero
> obs.pos <- tapply(dat[dat[,1] > 0,1], dat[dat[,1] > 0,-1], length)
> obs.neg <- tapply(dat[dat[,1] <= 0,1], dat[dat[,1] <= 0,-1], length)
> #write some coordinate data
> x.obs.pos <- rep(my.xlim[2],dim(obs.pos)[2])
> y.obs.pos <- 1:dim(obs.pos)[2]
> x.obs.neg <- rep(my.xlim[1],dim(obs.neg)[2])
> y.obs.neg <- 1:dim(obs.neg)[2]
> 
> bwplot(treatment~foo|group, data = dat,
>        panel=function(...) {
>            panel.violin(..., col = "transparent", varwidth = F)
>            panel.abline(v=0, lty = "dotted")
>            ltext(x.obs.pos, y.obs.pos, obs.pos, pos = 2)
>            ltext(x.obs.neg, y.obs.neg, obs.neg, pos = 4)
>        },
>        par.strip.text = list(cex = 0.8),  xlim = my.xlim)
> obs.pos
> obs.neg
> 
> # note that the numbers in the plot only match the matrices 
> for Group A,
> # which is the first panel. Alas.
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
>




More information about the R-help mailing list