Hi,
I am trying to add text to the bottom of a lattice bwplot with multiple panels. I would like to add a label below each boxplot, but the labels do not come from the data. I've tried the following, code: f1 <- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) f2 <- c(rep("A", 9), rep("B", 9)) dv <- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) df <- data.frame(f1, f2, dv) lab <- c(1, 2, 3, 4, 5, 6) bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), panel = function(x, y, ...) { panel.bwplot(x, y, ...) panel.text(x, 0.55, labels = lab) } ) I have two problems. First, the label values are writing over one another. I wrote a horrible hack (below) that fixes that problem, but I would like to know if there are better/more flexible ways to do this. bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), panel = function(x, y, ...) { x2 <- as.factor(c("a", "b", "c")) panel.bwplot(x, y, ...) panel.text(x2, 0.55, labels = lab) } ) Second, when using the horrible hack the first values are repeated in the second panel. How do I display the correct values in the second panel? The subscripts argument seems to do the trick when the labels come from the data, but how do I get the proper values when the labels come from outside of the data? Many thanks, Jeff ______________________________________________ [hidden email] 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. |
Hi:
After a number of false starts, I finally consulted Deepayan's book and the example on p. 73, suitably adapted, yielded a solution. Add a variable for the labels and then... df$lab <- rep(1:6, each = 3) bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), panel = function(x, y, ..., subscripts) { lab <- df$lab[subscripts] panel.bwplot(x, y, ...) panel.text(x, 0.55, labels = lab) } ) If you look closely, you'll see that each label is overplotted three times. A similar plot in ggplot2 would be library(ggplot2) ggplot(df, aes(x = f1, y = dv)) + geom_boxplot() + geom_text(aes(x = as.numeric(f1), lab = lab), y = 0.55, alpha = 0.5) + facet_wrap( ~ f2) + ylim(0.5, 1) The alpha argument in geom_text() is designed to mitigate the overplotting effect somewhat. HTH, Dennis On Fri, Apr 8, 2011 at 5:32 AM, Jeff Stevens <[hidden email]>wrote: > Hi, > > I am trying to add text to the bottom of a lattice bwplot with > multiple panels. I would like to add a label below each boxplot, but > the labels do not come from the data. I've tried the following, code: > > f1 <- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) > f2 <- c(rep("A", 9), rep("B", 9)) > dv <- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, > 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) > df <- data.frame(f1, f2, dv) > lab <- c(1, 2, 3, 4, 5, 6) > > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > panel = function(x, y, ...) { > panel.bwplot(x, y, ...) > panel.text(x, 0.55, labels = lab) > } > ) > > I have two problems. First, the label values are writing over one > another. I wrote a horrible hack (below) that fixes that problem, but > I would like to know if there are better/more flexible ways to do > this. > > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > panel = function(x, y, ...) { > x2 <- as.factor(c("a", "b", "c")) > panel.bwplot(x, y, ...) > panel.text(x2, 0.55, labels = lab) > } > ) > > Second, when using the horrible hack the first values are repeated in > the second panel. How do I display the correct values in the second > panel? The subscripts argument seems to do the trick when the labels > come from the data, but how do I get the proper values when the labels > come from outside of the data? > > > Many thanks, > Jeff > > ______________________________________________ > [hidden email] 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. > [[alternative HTML version deleted]] ______________________________________________ [hidden email] 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. |
Hi,
Thanks for the work around, Dennis. My actual data set has 64 replicates for each factor level combination (rather than the 3 in the example), so the overplotting is quite messy. Any ideas on how to avoid the overplotting? Jeff On Fri, Apr 8, 2011 at 7:32 PM, Dennis Murphy <[hidden email]> wrote: > Hi: > > After a number of false starts, I finally consulted Deepayan's book and the > example on p. 73, suitably adapted, yielded a solution. Add a variable for > the labels and then... > > df$lab <- rep(1:6, each = 3) > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > panel = function(x, y, ..., subscripts) { > lab <- df$lab[subscripts] > panel.bwplot(x, y, ...) > panel.text(x, 0.55, labels = lab) > } > ) > > If you look closely, you'll see that each label is overplotted three times. > A similar plot in ggplot2 would be > > library(ggplot2) > ggplot(df, aes(x = f1, y = dv)) + geom_boxplot() + > geom_text(aes(x = as.numeric(f1), lab = lab), y = 0.55, alpha = 0.5) + > facet_wrap( ~ f2) + ylim(0.5, 1) > > The alpha argument in geom_text() is designed to mitigate the overplotting > effect somewhat. > > HTH, > Dennis > > > On Fri, Apr 8, 2011 at 5:32 AM, Jeff Stevens <[hidden email]> > wrote: >> >> Hi, >> >> I am trying to add text to the bottom of a lattice bwplot with >> multiple panels. I would like to add a label below each boxplot, but >> the labels do not come from the data. I've tried the following, code: >> >> f1 <- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) >> f2 <- c(rep("A", 9), rep("B", 9)) >> dv <- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, >> 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) >> df <- data.frame(f1, f2, dv) >> lab <- c(1, 2, 3, 4, 5, 6) >> >> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >> panel = function(x, y, ...) { >> panel.bwplot(x, y, ...) >> panel.text(x, 0.55, labels = lab) >> } >> ) >> >> I have two problems. First, the label values are writing over one >> another. I wrote a horrible hack (below) that fixes that problem, but >> I would like to know if there are better/more flexible ways to do >> this. >> >> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >> panel = function(x, y, ...) { >> x2 <- as.factor(c("a", "b", "c")) >> panel.bwplot(x, y, ...) >> panel.text(x2, 0.55, labels = lab) >> } >> ) >> >> Second, when using the horrible hack the first values are repeated in >> the second panel. How do I display the correct values in the second >> panel? The subscripts argument seems to do the trick when the labels >> come from the data, but how do I get the proper values when the labels >> come from outside of the data? >> >> >> Many thanks, >> Jeff >> >> ______________________________________________ >> [hidden email] 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. > > -- Jeff Stevens Center for Adaptive Behavior and Cognition Max Planck Institute for Human Development Lentzealle 94 14195 Berlin, Germany ______________________________________________ [hidden email] 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. |
Hi:
One hopes that there is a more elegant solution than this bit of ad-hockery. >From your posted example: f1 <- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) f2 <- c(rep("A", 9), rep("B", 9)) dv <- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) df <- data.frame(f1, f2, dv) df$lab <- rep(1:6, each = 3) df$lab2 <- '' df$lab2[seq(1, 16, by = 3)] <- 1:6 # adapt to your situation - seq(1, nrow(df) - 63, by = 64), perhaps bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), panel = function(x, y, ..., subscripts) { lab <- df$lab2[subscripts] panel.bwplot(x, y, ...) panel.text(x, 0.55, labels = lab) } ) Alternatively, panel.text() takes an alpha = argument; for example, bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), panel = function(x, y, ..., subscripts) { lab <- df$lab[subscripts] panel.bwplot(x, y, ...) panel.text(x, 0.55, labels = lab, alpha = 0.5) } ) You could toy with the value of alpha until something acceptable emerges. But as I said, there is probably a better solution and I'm happy to be educated if there is. HTH, Dennis On Sat, Apr 9, 2011 at 4:56 AM, Jeff Stevens <[hidden email]>wrote: > Hi, > > Thanks for the work around, Dennis. My actual data set has 64 > replicates for each factor level combination (rather than the 3 in the > example), so the overplotting is quite messy. Any ideas on how to > avoid the overplotting? > > Jeff > > > On Fri, Apr 8, 2011 at 7:32 PM, Dennis Murphy <[hidden email]> wrote: > > Hi: > > > > After a number of false starts, I finally consulted Deepayan's book and > the > > example on p. 73, suitably adapted, yielded a solution. Add a variable > for > > the labels and then... > > > > df$lab <- rep(1:6, each = 3) > > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > > panel = function(x, y, ..., subscripts) { > > lab <- df$lab[subscripts] > > panel.bwplot(x, y, ...) > > panel.text(x, 0.55, labels = lab) > > } > > ) > > > > If you look closely, you'll see that each label is overplotted three > times. > > A similar plot in ggplot2 would be > > > > library(ggplot2) > > ggplot(df, aes(x = f1, y = dv)) + geom_boxplot() + > > geom_text(aes(x = as.numeric(f1), lab = lab), y = 0.55, alpha = 0.5) > + > > facet_wrap( ~ f2) + ylim(0.5, 1) > > > > The alpha argument in geom_text() is designed to mitigate the > overplotting > > effect somewhat. > > > > HTH, > > Dennis > > > > > > On Fri, Apr 8, 2011 at 5:32 AM, Jeff Stevens <[hidden email]> > > wrote: > >> > >> Hi, > >> > >> I am trying to add text to the bottom of a lattice bwplot with > >> multiple panels. I would like to add a label below each boxplot, but > >> the labels do not come from the data. I've tried the following, code: > >> > >> f1 <- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) > >> f2 <- c(rep("A", 9), rep("B", 9)) > >> dv <- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, > >> 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) > >> df <- data.frame(f1, f2, dv) > >> lab <- c(1, 2, 3, 4, 5, 6) > >> > >> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > >> panel = function(x, y, ...) { > >> panel.bwplot(x, y, ...) > >> panel.text(x, 0.55, labels = lab) > >> } > >> ) > >> > >> I have two problems. First, the label values are writing over one > >> another. I wrote a horrible hack (below) that fixes that problem, but > >> I would like to know if there are better/more flexible ways to do > >> this. > >> > >> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > >> panel = function(x, y, ...) { > >> x2 <- as.factor(c("a", "b", "c")) > >> panel.bwplot(x, y, ...) > >> panel.text(x2, 0.55, labels = lab) > >> } > >> ) > >> > >> Second, when using the horrible hack the first values are repeated in > >> the second panel. How do I display the correct values in the second > >> panel? The subscripts argument seems to do the trick when the labels > >> come from the data, but how do I get the proper values when the labels > >> come from outside of the data? > >> > >> > >> Many thanks, > >> Jeff > >> > >> ______________________________________________ > >> [hidden email] 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. > > > > > > > > -- > Jeff Stevens > Center for Adaptive Behavior and Cognition > Max Planck Institute for Human Development > Lentzealle 94 > 14195 Berlin, Germany > [[alternative HTML version deleted]] ______________________________________________ [hidden email] 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. |
On 2011-04-09 06:21, Dennis Murphy wrote:
> Hi: > > One hopes that there is a more elegant solution than this bit of ad-hockery. >> From your posted example: > > f1<- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) > f2<- c(rep("A", 9), rep("B", 9)) > dv<- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, > 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) > df<- data.frame(f1, f2, dv) > df$lab<- rep(1:6, each = 3) > > df$lab2<- '' > df$lab2[seq(1, 16, by = 3)]<- 1:6 # adapt to your situation - seq(1, > nrow(df) - 63, by = 64), perhaps > > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > panel = function(x, y, ..., subscripts) { > lab<- df$lab2[subscripts] > panel.bwplot(x, y, ...) > panel.text(x, 0.55, labels = lab) > } > ) > > Alternatively, panel.text() takes an alpha = argument; for example, > > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > panel = function(x, y, ..., subscripts) { > lab<- df$lab[subscripts] > panel.bwplot(x, y, ...) > panel.text(x, 0.55, labels = lab, alpha = 0.5) > } > ) > > You could toy with the value of alpha until something acceptable emerges. > But as I said, there is probably a better solution and I'm happy to be > educated if there is. Here's a slight variation on your first solution which doesn't require the data to be appropriately sorted, using your df: bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), panel = function(x, y, ..., subscripts) { lab <- df$lab[subscripts] lab[duplicated(lab)] <- "" panel.bwplot(x, y, ...) panel.text(x, 0.55, labels = lab) } ) and another variation which sets the text positions to NA for all but the first pass through the panel.text() function: bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), panel = function(x, y, ..., subscripts) { at.y <- rep(0.55, nrow(df)) is.na(at.y) <- which(duplicated(df$lab)) panel.bwplot(x, y, ...) panel.text(x, at.y[subscripts], labels = df$lab[subscripts]) } ) I think that the alpha argument is too one-off, i.e. dependent on how many levels in the boxplot. Peter Ehlers > > HTH, > Dennis > > On Sat, Apr 9, 2011 at 4:56 AM, Jeff Stevens<[hidden email]>wrote: > >> Hi, >> >> Thanks for the work around, Dennis. My actual data set has 64 >> replicates for each factor level combination (rather than the 3 in the >> example), so the overplotting is quite messy. Any ideas on how to >> avoid the overplotting? >> >> Jeff >> >> >> On Fri, Apr 8, 2011 at 7:32 PM, Dennis Murphy<[hidden email]> wrote: >>> Hi: >>> >>> After a number of false starts, I finally consulted Deepayan's book and >> the >>> example on p. 73, suitably adapted, yielded a solution. Add a variable >> for >>> the labels and then... >>> >>> df$lab<- rep(1:6, each = 3) >>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>> panel = function(x, y, ..., subscripts) { >>> lab<- df$lab[subscripts] >>> panel.bwplot(x, y, ...) >>> panel.text(x, 0.55, labels = lab) >>> } >>> ) >>> >>> If you look closely, you'll see that each label is overplotted three >> times. >>> A similar plot in ggplot2 would be >>> >>> library(ggplot2) >>> ggplot(df, aes(x = f1, y = dv)) + geom_boxplot() + >>> geom_text(aes(x = as.numeric(f1), lab = lab), y = 0.55, alpha = 0.5) >> + >>> facet_wrap( ~ f2) + ylim(0.5, 1) >>> >>> The alpha argument in geom_text() is designed to mitigate the >> overplotting >>> effect somewhat. >>> >>> HTH, >>> Dennis >>> >>> >>> On Fri, Apr 8, 2011 at 5:32 AM, Jeff Stevens<[hidden email]> >>> wrote: >>>> >>>> Hi, >>>> >>>> I am trying to add text to the bottom of a lattice bwplot with >>>> multiple panels. I would like to add a label below each boxplot, but >>>> the labels do not come from the data. I've tried the following, code: >>>> >>>> f1<- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) >>>> f2<- c(rep("A", 9), rep("B", 9)) >>>> dv<- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, >>>> 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) >>>> df<- data.frame(f1, f2, dv) >>>> lab<- c(1, 2, 3, 4, 5, 6) >>>> >>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>> panel = function(x, y, ...) { >>>> panel.bwplot(x, y, ...) >>>> panel.text(x, 0.55, labels = lab) >>>> } >>>> ) >>>> >>>> I have two problems. First, the label values are writing over one >>>> another. I wrote a horrible hack (below) that fixes that problem, but >>>> I would like to know if there are better/more flexible ways to do >>>> this. >>>> >>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>> panel = function(x, y, ...) { >>>> x2<- as.factor(c("a", "b", "c")) >>>> panel.bwplot(x, y, ...) >>>> panel.text(x2, 0.55, labels = lab) >>>> } >>>> ) >>>> >>>> Second, when using the horrible hack the first values are repeated in >>>> the second panel. How do I display the correct values in the second >>>> panel? The subscripts argument seems to do the trick when the labels >>>> come from the data, but how do I get the proper values when the labels >>>> come from outside of the data? >>>> >>>> >>>> Many thanks, >>>> Jeff >>>> >>>> ______________________________________________ >>>> [hidden email] 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. >>> >>> >> >> >> >> -- >> Jeff Stevens >> Center for Adaptive Behavior and Cognition >> Max Planck Institute for Human Development >> Lentzealle 94 >> 14195 Berlin, Germany >> > > [[alternative HTML version deleted]] > > ______________________________________________ > [hidden email] 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. ______________________________________________ [hidden email] 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. |
Hi Peter,
Thanks for the solutions. The only problem now is that I have duplicate values in my labels that are removed by the duplicated function. Perhaps a better example of the labels vector would be: lab <- c(1,2,4,4,6,6) Your first version would maintain the second 4 (because they are in different panels) but leave a blank for the second 6. 1 2 4 4 6 The second version removes the second 4 and 6. 1 2 4 6 The following works, but it is not very efficient for my full data set with six levels of f1, two levels of f2, and 64 replicates of each of these combinations. bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), panel = function(x, y, ..., subscripts) { lab <<- df$lab[subscripts] lab[c(2:3,5:6,8:9)] <<- "" panel.bwplot(x, y, ...) panel.text(x, 0.55, labels = lab) } ) Thanks, Jeff On Sat, Apr 9, 2011 at 7:52 PM, Peter Ehlers <[hidden email]> wrote: > On 2011-04-09 06:21, Dennis Murphy wrote: >> >> Hi: >> >> One hopes that there is a more elegant solution than this bit of >> ad-hockery. >>> >>> From your posted example: >> >> f1<- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) >> f2<- c(rep("A", 9), rep("B", 9)) >> dv<- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, >> 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) >> df<- data.frame(f1, f2, dv) >> df$lab<- rep(1:6, each = 3) >> >> df$lab2<- '' >> df$lab2[seq(1, 16, by = 3)]<- 1:6 # adapt to your situation - >> seq(1, >> nrow(df) - 63, by = 64), perhaps >> >> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >> panel = function(x, y, ..., subscripts) { >> lab<- df$lab2[subscripts] >> panel.bwplot(x, y, ...) >> panel.text(x, 0.55, labels = lab) >> } >> ) >> >> Alternatively, panel.text() takes an alpha = argument; for example, >> >> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >> panel = function(x, y, ..., subscripts) { >> lab<- df$lab[subscripts] >> panel.bwplot(x, y, ...) >> panel.text(x, 0.55, labels = lab, alpha = 0.5) >> } >> ) >> >> You could toy with the value of alpha until something acceptable emerges. >> But as I said, there is probably a better solution and I'm happy to be >> educated if there is. > > Here's a slight variation on your first solution which doesn't > require the data to be appropriately sorted, using your df: > > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > panel = function(x, y, ..., subscripts) { > lab <- df$lab[subscripts] > lab[duplicated(lab)] <- "" > panel.bwplot(x, y, ...) > panel.text(x, 0.55, labels = lab) > } > ) > > and another variation which sets the text positions to NA for > all but the first pass through the panel.text() function: > > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > panel = function(x, y, ..., subscripts) { > at.y <- rep(0.55, nrow(df)) > is.na(at.y) <- which(duplicated(df$lab)) > panel.bwplot(x, y, ...) > panel.text(x, at.y[subscripts], labels = df$lab[subscripts]) > } > ) > > I think that the alpha argument is too one-off, i.e. dependent on > how many levels in the boxplot. > > Peter Ehlers > >> >> HTH, >> Dennis >> >> On Sat, Apr 9, 2011 at 4:56 AM, Jeff >> Stevens<[hidden email]>wrote: >> >>> Hi, >>> >>> Thanks for the work around, Dennis. My actual data set has 64 >>> replicates for each factor level combination (rather than the 3 in the >>> example), so the overplotting is quite messy. Any ideas on how to >>> avoid the overplotting? >>> >>> Jeff >>> >>> >>> On Fri, Apr 8, 2011 at 7:32 PM, Dennis Murphy<[hidden email]> wrote: >>>> >>>> Hi: >>>> >>>> After a number of false starts, I finally consulted Deepayan's book and >>> >>> the >>>> >>>> example on p. 73, suitably adapted, yielded a solution. Add a variable >>> >>> for >>>> >>>> the labels and then... >>>> >>>> df$lab<- rep(1:6, each = 3) >>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>> panel = function(x, y, ..., subscripts) { >>>> lab<- df$lab[subscripts] >>>> panel.bwplot(x, y, ...) >>>> panel.text(x, 0.55, labels = lab) >>>> } >>>> ) >>>> >>>> If you look closely, you'll see that each label is overplotted three >>> >>> times. >>>> >>>> A similar plot in ggplot2 would be >>>> >>>> library(ggplot2) >>>> ggplot(df, aes(x = f1, y = dv)) + geom_boxplot() + >>>> geom_text(aes(x = as.numeric(f1), lab = lab), y = 0.55, alpha = 0.5) >>> >>> + >>>> >>>> facet_wrap( ~ f2) + ylim(0.5, 1) >>>> >>>> The alpha argument in geom_text() is designed to mitigate the >>> >>> overplotting >>>> >>>> effect somewhat. >>>> >>>> HTH, >>>> Dennis >>>> >>>> >>>> On Fri, Apr 8, 2011 at 5:32 AM, Jeff Stevens<[hidden email]> >>>> wrote: >>>>> >>>>> Hi, >>>>> >>>>> I am trying to add text to the bottom of a lattice bwplot with >>>>> multiple panels. I would like to add a label below each boxplot, but >>>>> the labels do not come from the data. I've tried the following, code: >>>>> >>>>> f1<- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) >>>>> f2<- c(rep("A", 9), rep("B", 9)) >>>>> dv<- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, >>>>> 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) >>>>> df<- data.frame(f1, f2, dv) >>>>> lab<- c(1, 2, 3, 4, 5, 6) >>>>> >>>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>>> panel = function(x, y, ...) { >>>>> panel.bwplot(x, y, ...) >>>>> panel.text(x, 0.55, labels = lab) >>>>> } >>>>> ) >>>>> >>>>> I have two problems. First, the label values are writing over one >>>>> another. I wrote a horrible hack (below) that fixes that problem, but >>>>> I would like to know if there are better/more flexible ways to do >>>>> this. >>>>> >>>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>>> panel = function(x, y, ...) { >>>>> x2<- as.factor(c("a", "b", "c")) >>>>> panel.bwplot(x, y, ...) >>>>> panel.text(x2, 0.55, labels = lab) >>>>> } >>>>> ) >>>>> >>>>> Second, when using the horrible hack the first values are repeated in >>>>> the second panel. How do I display the correct values in the second >>>>> panel? The subscripts argument seems to do the trick when the labels >>>>> come from the data, but how do I get the proper values when the labels >>>>> come from outside of the data? >>>>> >>>>> >>>>> Many thanks, >>>>> Jeff >>>>> >>>>> ______________________________________________ >>>>> [hidden email] 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. >>>> >>>> >>> >>> >>> >>> -- >>> Jeff Stevens >>> Center for Adaptive Behavior and Cognition >>> Max Planck Institute for Human Development >>> Lentzealle 94 >>> 14195 Berlin, Germany >>> >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> [hidden email] 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. > > ______________________________________________ [hidden email] 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. |
On 2011-04-10 04:50, Jeff Stevens wrote:
> Hi Peter, > > Thanks for the solutions. The only problem now is that I have > duplicate values in my labels that are removed by the duplicated > function. Perhaps a better example of the labels vector would be: > lab<- c(1,2,4,4,6,6) > > Your first version would maintain the second 4 (because they are in > different panels) but leave a blank for the second 6. > 1 2 4 4 6 > The second version removes the second 4 and 6. > 1 2 4 6 > > The following works, but it is not very efficient for my full data set > with six levels of f1, two levels of f2, and 64 replicates of each of > these combinations. > > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > panel = function(x, y, ..., subscripts) { > lab<<- df$lab[subscripts] > lab[c(2:3,5:6,8:9)]<<- "" > panel.bwplot(x, y, ...) > panel.text(x, 0.55, labels = lab) > } > ) Good point; I hadn't thought of that. Now I realize that a solution that fiddles with the labels inside the panel function is likely to be less efficient anyway. So let's adjust the labels to be printed before we do the bwplot() call. What's needed is to set to blanks the labels that are duplicates because they correspond to duplicated (f1,f2) combinations. ## add an adjusted labels variable to the data; ## lab is the current vector of labels; names(df) #[1] "f1" "f2" "dv" "lab" df <- transform(df, lab2 = ifelse(duplicated(df[, c("f1","f2")]), "", lab)) ## now use lab2 in bwplot() bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), panel = function(x, y, ..., subscripts) { lab <- df$lab2[subscripts] # note the lab2 panel.bwplot(x, y, ...) panel.text(x, 0.55, labels = lab) } ) Peter Ehlers > > Thanks, > Jeff > > > On Sat, Apr 9, 2011 at 7:52 PM, Peter Ehlers<[hidden email]> wrote: >> On 2011-04-09 06:21, Dennis Murphy wrote: >>> >>> Hi: >>> >>> One hopes that there is a more elegant solution than this bit of >>> ad-hockery. >>>> >>>> From your posted example: >>> >>> f1<- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) >>> f2<- c(rep("A", 9), rep("B", 9)) >>> dv<- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, >>> 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) >>> df<- data.frame(f1, f2, dv) >>> df$lab<- rep(1:6, each = 3) >>> >>> df$lab2<- '' >>> df$lab2[seq(1, 16, by = 3)]<- 1:6 # adapt to your situation - >>> seq(1, >>> nrow(df) - 63, by = 64), perhaps >>> >>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>> panel = function(x, y, ..., subscripts) { >>> lab<- df$lab2[subscripts] >>> panel.bwplot(x, y, ...) >>> panel.text(x, 0.55, labels = lab) >>> } >>> ) >>> >>> Alternatively, panel.text() takes an alpha = argument; for example, >>> >>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>> panel = function(x, y, ..., subscripts) { >>> lab<- df$lab[subscripts] >>> panel.bwplot(x, y, ...) >>> panel.text(x, 0.55, labels = lab, alpha = 0.5) >>> } >>> ) >>> >>> You could toy with the value of alpha until something acceptable emerges. >>> But as I said, there is probably a better solution and I'm happy to be >>> educated if there is. >> >> Here's a slight variation on your first solution which doesn't >> require the data to be appropriately sorted, using your df: >> >> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >> panel = function(x, y, ..., subscripts) { >> lab<- df$lab[subscripts] >> lab[duplicated(lab)]<- "" >> panel.bwplot(x, y, ...) >> panel.text(x, 0.55, labels = lab) >> } >> ) >> >> and another variation which sets the text positions to NA for >> all but the first pass through the panel.text() function: >> >> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >> panel = function(x, y, ..., subscripts) { >> at.y<- rep(0.55, nrow(df)) >> is.na(at.y)<- which(duplicated(df$lab)) >> panel.bwplot(x, y, ...) >> panel.text(x, at.y[subscripts], labels = df$lab[subscripts]) >> } >> ) >> >> I think that the alpha argument is too one-off, i.e. dependent on >> how many levels in the boxplot. >> >> Peter Ehlers >> >>> >>> HTH, >>> Dennis >>> >>> On Sat, Apr 9, 2011 at 4:56 AM, Jeff >>> Stevens<[hidden email]>wrote: >>> >>>> Hi, >>>> >>>> Thanks for the work around, Dennis. My actual data set has 64 >>>> replicates for each factor level combination (rather than the 3 in the >>>> example), so the overplotting is quite messy. Any ideas on how to >>>> avoid the overplotting? >>>> >>>> Jeff >>>> >>>> >>>> On Fri, Apr 8, 2011 at 7:32 PM, Dennis Murphy<[hidden email]> wrote: >>>>> >>>>> Hi: >>>>> >>>>> After a number of false starts, I finally consulted Deepayan's book and >>>> >>>> the >>>>> >>>>> example on p. 73, suitably adapted, yielded a solution. Add a variable >>>> >>>> for >>>>> >>>>> the labels and then... >>>>> >>>>> df$lab<- rep(1:6, each = 3) >>>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>>> panel = function(x, y, ..., subscripts) { >>>>> lab<- df$lab[subscripts] >>>>> panel.bwplot(x, y, ...) >>>>> panel.text(x, 0.55, labels = lab) >>>>> } >>>>> ) >>>>> >>>>> If you look closely, you'll see that each label is overplotted three >>>> >>>> times. >>>>> >>>>> A similar plot in ggplot2 would be >>>>> >>>>> library(ggplot2) >>>>> ggplot(df, aes(x = f1, y = dv)) + geom_boxplot() + >>>>> geom_text(aes(x = as.numeric(f1), lab = lab), y = 0.55, alpha = 0.5) >>>> >>>> + >>>>> >>>>> facet_wrap( ~ f2) + ylim(0.5, 1) >>>>> >>>>> The alpha argument in geom_text() is designed to mitigate the >>>> >>>> overplotting >>>>> >>>>> effect somewhat. >>>>> >>>>> HTH, >>>>> Dennis >>>>> >>>>> >>>>> On Fri, Apr 8, 2011 at 5:32 AM, Jeff Stevens<[hidden email]> >>>>> wrote: >>>>>> >>>>>> Hi, >>>>>> >>>>>> I am trying to add text to the bottom of a lattice bwplot with >>>>>> multiple panels. I would like to add a label below each boxplot, but >>>>>> the labels do not come from the data. I've tried the following, code: >>>>>> >>>>>> f1<- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) >>>>>> f2<- c(rep("A", 9), rep("B", 9)) >>>>>> dv<- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, >>>>>> 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) >>>>>> df<- data.frame(f1, f2, dv) >>>>>> lab<- c(1, 2, 3, 4, 5, 6) >>>>>> >>>>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>>>> panel = function(x, y, ...) { >>>>>> panel.bwplot(x, y, ...) >>>>>> panel.text(x, 0.55, labels = lab) >>>>>> } >>>>>> ) >>>>>> >>>>>> I have two problems. First, the label values are writing over one >>>>>> another. I wrote a horrible hack (below) that fixes that problem, but >>>>>> I would like to know if there are better/more flexible ways to do >>>>>> this. >>>>>> >>>>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>>>> panel = function(x, y, ...) { >>>>>> x2<- as.factor(c("a", "b", "c")) >>>>>> panel.bwplot(x, y, ...) >>>>>> panel.text(x2, 0.55, labels = lab) >>>>>> } >>>>>> ) >>>>>> >>>>>> Second, when using the horrible hack the first values are repeated in >>>>>> the second panel. How do I display the correct values in the second >>>>>> panel? The subscripts argument seems to do the trick when the labels >>>>>> come from the data, but how do I get the proper values when the labels >>>>>> come from outside of the data? >>>>>> >>>>>> >>>>>> Many thanks, >>>>>> Jeff >>>>>> >>>>>> ______________________________________________ >>>>>> [hidden email] 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. >>>>> >>>>> >>>> >>>> >>>> >>>> -- >>>> Jeff Stevens >>>> Center for Adaptive Behavior and Cognition >>>> Max Planck Institute for Human Development >>>> Lentzealle 94 >>>> 14195 Berlin, Germany >>>> >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> [hidden email] 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. >> >> ______________________________________________ [hidden email] 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. |
Many thanks, Peter. This works brilliantly, and I prefer to have the
labels assigned outside of panel function as well. Cheers, Jeff On Sun, Apr 10, 2011 at 5:18 PM, Peter Ehlers <[hidden email]> wrote: > On 2011-04-10 04:50, Jeff Stevens wrote: >> >> Hi Peter, >> >> Thanks for the solutions. The only problem now is that I have >> duplicate values in my labels that are removed by the duplicated >> function. Perhaps a better example of the labels vector would be: >> lab<- c(1,2,4,4,6,6) >> >> Your first version would maintain the second 4 (because they are in >> different panels) but leave a blank for the second 6. >> 1 2 4 4 6 >> The second version removes the second 4 and 6. >> 1 2 4 6 >> >> The following works, but it is not very efficient for my full data set >> with six levels of f1, two levels of f2, and 64 replicates of each of >> these combinations. >> >> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >> panel = function(x, y, ..., subscripts) { >> lab<<- df$lab[subscripts] >> lab[c(2:3,5:6,8:9)]<<- "" >> panel.bwplot(x, y, ...) >> panel.text(x, 0.55, labels = lab) >> } >> ) > > Good point; I hadn't thought of that. Now I realize that a > solution that fiddles with the labels inside the panel > function is likely to be less efficient anyway. So let's > adjust the labels to be printed before we do the bwplot() > call. What's needed is to set to blanks the labels that > are duplicates because they correspond to duplicated > (f1,f2) combinations. > > ## add an adjusted labels variable to the data; > ## lab is the current vector of labels; > names(df) > #[1] "f1" "f2" "dv" "lab" > > df <- transform(df, > lab2 = ifelse(duplicated(df[, c("f1","f2")]), "", lab)) > > ## now use lab2 in bwplot() > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > panel = function(x, y, ..., subscripts) { > lab <- df$lab2[subscripts] # note the lab2 > panel.bwplot(x, y, ...) > panel.text(x, 0.55, labels = lab) > } > ) > > Peter Ehlers > >> >> Thanks, >> Jeff >> >> >> On Sat, Apr 9, 2011 at 7:52 PM, Peter Ehlers<[hidden email]> wrote: >>> >>> On 2011-04-09 06:21, Dennis Murphy wrote: >>>> >>>> Hi: >>>> >>>> One hopes that there is a more elegant solution than this bit of >>>> ad-hockery. >>>>> >>>>> From your posted example: >>>> >>>> f1<- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) >>>> f2<- c(rep("A", 9), rep("B", 9)) >>>> dv<- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, >>>> 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) >>>> df<- data.frame(f1, f2, dv) >>>> df$lab<- rep(1:6, each = 3) >>>> >>>> df$lab2<- '' >>>> df$lab2[seq(1, 16, by = 3)]<- 1:6 # adapt to your situation - >>>> seq(1, >>>> nrow(df) - 63, by = 64), perhaps >>>> >>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>> panel = function(x, y, ..., subscripts) { >>>> lab<- df$lab2[subscripts] >>>> panel.bwplot(x, y, ...) >>>> panel.text(x, 0.55, labels = lab) >>>> } >>>> ) >>>> >>>> Alternatively, panel.text() takes an alpha = argument; for example, >>>> >>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>> panel = function(x, y, ..., subscripts) { >>>> lab<- df$lab[subscripts] >>>> panel.bwplot(x, y, ...) >>>> panel.text(x, 0.55, labels = lab, alpha = 0.5) >>>> } >>>> ) >>>> >>>> You could toy with the value of alpha until something acceptable >>>> emerges. >>>> But as I said, there is probably a better solution and I'm happy to be >>>> educated if there is. >>> >>> Here's a slight variation on your first solution which doesn't >>> require the data to be appropriately sorted, using your df: >>> >>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>> panel = function(x, y, ..., subscripts) { >>> lab<- df$lab[subscripts] >>> lab[duplicated(lab)]<- "" >>> panel.bwplot(x, y, ...) >>> panel.text(x, 0.55, labels = lab) >>> } >>> ) >>> >>> and another variation which sets the text positions to NA for >>> all but the first pass through the panel.text() function: >>> >>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>> panel = function(x, y, ..., subscripts) { >>> at.y<- rep(0.55, nrow(df)) >>> is.na(at.y)<- which(duplicated(df$lab)) >>> panel.bwplot(x, y, ...) >>> panel.text(x, at.y[subscripts], labels = df$lab[subscripts]) >>> } >>> ) >>> >>> I think that the alpha argument is too one-off, i.e. dependent on >>> how many levels in the boxplot. >>> >>> Peter Ehlers >>> >>>> >>>> HTH, >>>> Dennis >>>> >>>> On Sat, Apr 9, 2011 at 4:56 AM, Jeff >>>> Stevens<[hidden email]>wrote: >>>> >>>>> Hi, >>>>> >>>>> Thanks for the work around, Dennis. My actual data set has 64 >>>>> replicates for each factor level combination (rather than the 3 in the >>>>> example), so the overplotting is quite messy. Any ideas on how to >>>>> avoid the overplotting? >>>>> >>>>> Jeff >>>>> >>>>> >>>>> On Fri, Apr 8, 2011 at 7:32 PM, Dennis Murphy<[hidden email]> >>>>> wrote: >>>>>> >>>>>> Hi: >>>>>> >>>>>> After a number of false starts, I finally consulted Deepayan's book >>>>>> and >>>>> >>>>> the >>>>>> >>>>>> example on p. 73, suitably adapted, yielded a solution. Add a variable >>>>> >>>>> for >>>>>> >>>>>> the labels and then... >>>>>> >>>>>> df$lab<- rep(1:6, each = 3) >>>>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>>>> panel = function(x, y, ..., subscripts) { >>>>>> lab<- df$lab[subscripts] >>>>>> panel.bwplot(x, y, ...) >>>>>> panel.text(x, 0.55, labels = lab) >>>>>> } >>>>>> ) >>>>>> >>>>>> If you look closely, you'll see that each label is overplotted three >>>>> >>>>> times. >>>>>> >>>>>> A similar plot in ggplot2 would be >>>>>> >>>>>> library(ggplot2) >>>>>> ggplot(df, aes(x = f1, y = dv)) + geom_boxplot() + >>>>>> geom_text(aes(x = as.numeric(f1), lab = lab), y = 0.55, alpha = >>>>>> 0.5) >>>>> >>>>> + >>>>>> >>>>>> facet_wrap( ~ f2) + ylim(0.5, 1) >>>>>> >>>>>> The alpha argument in geom_text() is designed to mitigate the >>>>> >>>>> overplotting >>>>>> >>>>>> effect somewhat. >>>>>> >>>>>> HTH, >>>>>> Dennis >>>>>> >>>>>> >>>>>> On Fri, Apr 8, 2011 at 5:32 AM, Jeff Stevens<[hidden email]> >>>>>> wrote: >>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> I am trying to add text to the bottom of a lattice bwplot with >>>>>>> multiple panels. I would like to add a label below each boxplot, but >>>>>>> the labels do not come from the data. I've tried the following, >>>>>>> code: >>>>>>> >>>>>>> f1<- c(rep(c(rep("a", 3), rep("b", 3), rep("c", 3)), 2)) >>>>>>> f2<- c(rep("A", 9), rep("B", 9)) >>>>>>> dv<- c(0.9, 0.8, 0.85, 0.6, 0.65, 0.7, 0.8, 0.85, 0.8, 0.95, 0.85, >>>>>>> 0.9, 0.65, 0.7, 0.75, 0.85, 0.9, 0.85) >>>>>>> df<- data.frame(f1, f2, dv) >>>>>>> lab<- c(1, 2, 3, 4, 5, 6) >>>>>>> >>>>>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>>>>> panel = function(x, y, ...) { >>>>>>> panel.bwplot(x, y, ...) >>>>>>> panel.text(x, 0.55, labels = lab) >>>>>>> } >>>>>>> ) >>>>>>> >>>>>>> I have two problems. First, the label values are writing over one >>>>>>> another. I wrote a horrible hack (below) that fixes that problem, >>>>>>> but >>>>>>> I would like to know if there are better/more flexible ways to do >>>>>>> this. >>>>>>> >>>>>>> bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), >>>>>>> panel = function(x, y, ...) { >>>>>>> x2<- as.factor(c("a", "b", "c")) >>>>>>> panel.bwplot(x, y, ...) >>>>>>> panel.text(x2, 0.55, labels = lab) >>>>>>> } >>>>>>> ) >>>>>>> >>>>>>> Second, when using the horrible hack the first values are repeated in >>>>>>> the second panel. How do I display the correct values in the second >>>>>>> panel? The subscripts argument seems to do the trick when the labels >>>>>>> come from the data, but how do I get the proper values when the >>>>>>> labels >>>>>>> come from outside of the data? >>>>>>> >>>>>>> >>>>>>> Many thanks, >>>>>>> Jeff >>>>>>> >>>>>>> ______________________________________________ >>>>>>> [hidden email] 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. >>>>>> >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Jeff Stevens >>>>> Center for Adaptive Behavior and Cognition >>>>> Max Planck Institute for Human Development >>>>> Lentzealle 94 >>>>> 14195 Berlin, Germany >>>>> >>>> >>>> [[alternative HTML version deleted]] >>>> >>>> ______________________________________________ >>>> [hidden email] 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. >>> >>> > > ______________________________________________ [hidden email] 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. |
On 2011-04-10 12:19, Jeff Stevens wrote:
> Many thanks, Peter. This works brilliantly, and I prefer to have the > labels assigned outside of panel function as well. > > Cheers, > Jeff Small add-on: It's probably best to ensure that the labels are of type character, not factor. Peter [...snip...] ______________________________________________ [hidden email] 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. |
In reply to this post by Jeff Stevens-2
On Mon, Apr 11, 2011 at 12:49 AM, Jeff Stevens <[hidden email]> wrote:
> Many thanks, Peter. This works brilliantly, and I prefer to have the > labels assigned outside of panel function as well. You could also consider using which.packet(). You haven't explicitly told us how the labels are matched with the boxplots, but assuming that the labels are in the order of plotting, you can do [using the original data]: df <- data.frame(f1, f2, dv) lab <- c(1, 2, 3, 4, 5, 6) bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), text.labels = as.character(lab), panel = function(x, y, ..., text.labels) { panel.bwplot(x, y, ...) n <- nlevels(x) i <- seq_len(n) + (which.packet() - 1) * n print(text.labels[i]) panel.text(x = seq_len(n), y = 0.55, labels = text.labels[i]) }) -Deepayan ______________________________________________ [hidden email] 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. |
Hi Deepayan
Many thanks for bringing the which.packet() function to my attention--I missed it in the book. I do prefer that the panel function applies the labels to the data rather than adding them directly to the data in advance. Jeff On Tue, Apr 12, 2011 at 8:50 AM, Deepayan Sarkar <[hidden email]> wrote: > On Mon, Apr 11, 2011 at 12:49 AM, Jeff Stevens <[hidden email]> wrote: >> Many thanks, Peter. This works brilliantly, and I prefer to have the >> labels assigned outside of panel function as well. > > You could also consider using which.packet(). You haven't explicitly > told us how the labels are matched with the boxplots, but assuming > that the labels are in the order of plotting, you can do [using the > original data]: > > > df <- data.frame(f1, f2, dv) > lab <- c(1, 2, 3, 4, 5, 6) > > bwplot(dv ~ f1 | f2, data = df, ylim = c(0.5, 1), > text.labels = as.character(lab), > panel = function(x, y, ..., text.labels) { > panel.bwplot(x, y, ...) > n <- nlevels(x) > i <- seq_len(n) + (which.packet() - 1) * n > print(text.labels[i]) > panel.text(x = seq_len(n), y = 0.55, > labels = text.labels[i]) > }) > > -Deepayan > ______________________________________________ [hidden email] 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. |
Free forum by Nabble | Edit this page |