Skip to content

centering axis labels in lattice

2 messages · Paul Boutros, Deepayan Sarkar

#
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!

Paul
R version 2.8.1 (2008-12-22)
i386-pc-mingw32

locale:
LC_COLLATE=English_United States.1252;LC_CTYPE=English_United  
States.1252;LC_MONETARY=English_United  
States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] lattice_0.17-22
#
On Fri, May 8, 2009 at 8:08 AM, Paul Boutros <paul.boutros at utoronto.ca> wrote:
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