On May 15, 2008, at 3:18 AM, RINNER Heinrich wrote:

Thanks for your help!
I guess I could have thought for ages about this, and never would such a solution have come to my mind ;-) It works as far as the text in the strips is left-aligned; a remaining drawback is that printing of longer texts will be continued outside the right border of their strip.

Yes, the only way to fix that I think will likely be to tell it to clip the string off, and to do that you would likely want to copy some of what strip.default does with viewports. Effectively, you need to create a new viewport occupying the strip space, and tell it to use clipping there. See the code for strip.default, and the pushViewport and upViewport calls. For example, using that code, this might work:

require(grid)
strip.left.aligned <- function(which.given, which.panel, factor.levels, ...) {
  pushViewport(viewport(y = (which.given - 0.5)/length(which.panel),
height = 1/length(which.panel), clip = trellis.par.get ("clip")$strip,
        name = paste("strip.default", which.given, sep = ".")))
panel.rect(0, 0, 1, 1, col = trellis.par.get("strip.background") $col[which.given], border = 1) panel.text(x = 0, y = 0.5, pos = 4, lab = factor.levels [which.panel[which.given]])
   upViewport()
}
xyplot(y ~ x | a, data = test, strip = strip.left.aligned)

Haris Skiadas
Department of Mathematics and Computer Science
Hanover College


For example, using your suggestion:

###
library(lattice)
test <- data.frame(x=rnorm(100), y=rnorm(100), a=rep(c("A", "B", "C", "D: left-aligned text (possibly looooooooooooooooooooooooooooooooooooooooong string"),25))

strip.left.aligned <- function(which.given, which.panel, factor.levels, ...) { panel.rect(0, 0, 1, 1, col = trellis.par.get("strip.background") $col[which.given], border = 1) panel.text(x = 0, y = 0.5, pos = 4, lab = factor.levels [which.panel[which.given]])
}

xyplot(y ~ x | a, data = test, strip = strip.left.aligned)
###

Anywag, thanks again for having taken the time thinking about my question;
Heinrich.

-----Ursprüngliche Nachricht-----
Von: Charilaos Skiadas [mailto:[EMAIL PROTECTED]
Gesendet: Mittwoch, 14. Mai 2008 13:30
An: RINNER Heinrich
Cc: [EMAIL PROTECTED]
Betreff: Re: [R] lattice: left-aligned text in strips?



On May 14, 2008, at 3:47 AM, RINNER Heinrich wrote:

[adapted repost of question
http://tolstoy.newcastle.edu.au/R/e4/help/08/03/6260.html]

Dear R community,

by default, text in the strips of a trellis plot is centered in the
strip.
Is there a way to have the text left-aligned?

For example:

library(lattice)
test <- data.frame(x=rnorm(100), y=rnorm(100), a=rep(c("A: centered
text","B: centered text"),50))
xyplot(y ~ x | a, data = test)  # ok, strip text is centered
test <- data.frame(x=rnorm(100), y=rnorm(100), a=rep(c("A: left-
aligned
text","B: left-aligned text (possibly
loooooooooooooooooooooooooooong
string"),50))
xyplot(y ~ x | a, data = test)  # how???

Here's a way to do it, shamelessly stealing the main idea from:
http://dsarkar.fhcrc.org/lattice/book/figures.html?
chapter=10;figure=10_24

Mainly you just have to write your own strip function.

xyplot(Petal.Length~Petal.Width|Species, iris, strip=function
(which.given,which.panel, factor.levels,...) {
   panel.rect(0, 0, 1, 1, col = trellis.par.get("strip.background")
$col[which.given], border = 1)
   panel.text(x = 0, y = 0.5, pos = 4, lab =
factor.levels[which.panel
[which.given]])
} )

Better yet, you should probably write a more generic strip function
that does what you want.

I would however consider using ?abbreviate for what you want to do
instead.

I am using R 2.6.2 on Windows XP, package lattice Version 0.17-6.

[The reason I would like to do this is because "in real life" my
conditioning variable 'a' can have quite long strings as
its value.
I am
automatically creating a series of trellis plots, and in each one a
different number of panels will be produced (maybe 4, maybe
20,...). So
in some cases (few panels, short labels) text in the strips will be
perfectly readable, while in some cases (many panels, long labels)
only
the middle of the text will.
I know I could abbreviate the strip text by using something like:
xyplot(y ~ x | substr(a,1,35), data = test)
But there is no "natural" choice of string length here when
I want to
cut off as few text as possible, so just left aligning the
strip texts
would seem like a natural and easy(?) solution to me - if I was
able to
do it...]

-Heinrich.

Haris Skiadas
Department of Mathematics and Computer Science
Hanover College






______________________________________________
R-help@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.

Reply via email to