问题
Say I want to create an ordinary xyplot
without explicitly specifying axis limits, then how are axis limits calculated?
The following line of code produces a simple scatter plot. However, axis limits do not exactly range from 1 to 10, but are slightly expanded to the left and right and top and bottom sides (roughly by 0.5).
library(lattice)
xyplot(1:10 ~ 1:10, cex = 1.5, pch = 20, col = "black",
xlab = "x", ylab = "y")
Is there any way to determine the factor by which the axes were expanded on each site, e.g. using trellis.par.get
? I already tried the following after executing the above-mentioned xyplot
command:
library(grid)
downViewport(trellis.vpname(name = "figure"))
current.panel.limits()
$xlim
[1] 0 1
$ylim
[1] 0 1
Unfortunately, the panel limits are returned as normalized parent coordinates, which makes it impossible to obtain the "real" limits. Any suggestions would be highly appreciated!
Update:
Using base-R plot
, the data range (and consequently the axis limits) is by default extended by 4% on each side, see ?par
. But this factor doesn't seem to apply to 'trellis' objects. So what I am looking for is an analogue to the 'xaxs' (and 'yaxs') argument implemented in par
.
回答1:
Axis limits for xyplot
are calculated in the extend.limits
function. This function isn't exported from the lattice package, so to see it, type lattice:::extend.limits
. Concerning a numeric vector, this function is passed the range of values from the corresponding data (c(1, 10)
in this example). The final limits are calculated according to the following equation:
lim + prop * d * c(-1, 1)
lim
are the limits of the data, in this casec(1, 10)
prop
islattice.getOption("axis.padding")$numeric
, which by default is0.07
d
isdiff(as.numeric(lim))
, in this case9
The result in this case is c(0.37, 10.63)
In case you're interested, the call stack from xyplot
to extend.limits
is
xyplot
xyplot.formula
limits.and.aspect
limitsFromLimitList
extend.limits
来源:https://stackoverflow.com/questions/28879856/how-are-trellis-axis-limits-calculated