On Fri, May 8, 2009 at 8:08 AM, Paul Boutros <paul.bout...@utoronto.ca> wrote: > Hello, > > I'm attempting to alter the location of text in my axis labels in lattice > plots and have been unsuccessful so far. For example, the y-axis labels are > always right-justified, but I would like them to be horizontally centered. > > Here's an example: > library(lattice); > > # create fake dataset to plot > to.plot <- data.frame( > x = 1:5, > y = c("1\nAAA", "2\nBBB", "3\nCCC", "4\nDDD", "5\nEEE") > ); > > # initial plot, note that the y-axis labels are right-justified > xyplot( > y ~ x, > to.plot, > pch = 19, > ylab = "", > xlab = "", > cex = 3 > ); > > # now try to set the positioning via scales > xyplot( > y ~ x, > to.plot, > pch = 19, > ylab = "", > xlab = "", > cex = 3, > scales = list( > labels = to.plot$y, > hjust = 0.5, > vjust = 0.5 > ) > ); > > I also explored using yscale.components.default(), but specifying hjust and > vjust there did not help. Any suggestions would be very much appreciated!
The justification calculations are hard-coded in the default axis function 'axis.default' (mainly to handle rotated labels). You can provide your own axis function to override this. A general replacement would be a lot more complicated, but this should suffice for your example (it could be simplified further if you don't care about tick marks). axis.y <- function(side, components, ...) { if (side == "left") { require(grid) str(components) axis.units <- lattice.getOption("axis.units")[["outer"]][["left"]] axis.settings <- trellis.par.get("axis.components")[["left"]] tck.unit.x <- components$left$ticks$tck * axis.settings$tck * axis.units$tick$x tck.unit <- unit(x = tck.unit.x, units = axis.units$tick$units) with(components$left$ticks, { grid.segments(y0 = unit(at, "native"), y1 = unit(at, "native"), x0 = unit(0, "npc"), x1 = -1 * tck.unit) }) with(components$left$labels, { lab.unit <- tck.unit + unit(x = axis.settings$pad1 * axis.units$pad1$x, units = axis.units$pad1$units) + 0.5 * unit(1, "grobwidth", textGrob(labels)) grid.text(label = labels, y = unit(at, "native"), x = -1 * lab.unit, just = "center") }) } else axis.default(side = side, components = components, ...) } xyplot(y ~ x, to.plot, pch = 19, ylab = "", xlab = "", cex = 3, axis = axis.y) At some point I should allow the labels to be "grobs", which should make things like this a bit simpler. -Deepayan ______________________________________________ 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.