R xyplot最后一行的面板少于列时的底部轴

R xyplot最后一行的面板少于列时的底部轴,r,plot,lattice,R,Plot,Lattice,考虑一个晶格xyplot,该晶格具有关系='fixed',交替=FALSE,以及as.table=TRUE 如果最后一行面板不完整(即布局中的面板少于列),则不会打印x轴。例如,下图中的面板4没有x轴标记/标签 library(lattice) d <- data.frame(x=runif(100), y=runif(100), grp=gl(5, 20)) xyplot(y~x|grp, d, as.table=TRUE, scales=list(alternating=FALSE,

考虑一个晶格
xyplot
,该晶格具有
关系='fixed'
交替=FALSE
,以及
as.table=TRUE

如果最后一行面板不完整(即布局中的面板少于列),则不会打印x轴。例如,下图中的面板4没有x轴标记/标签

library(lattice)
d <- data.frame(x=runif(100), y=runif(100), grp=gl(5, 20))
xyplot(y~x|grp, d, as.table=TRUE, scales=list(alternating=FALSE, tck=c(1, 0)))
库(晶格)

d我不是晶格专家,但我相信这可能有效。这个想法最初是发布的。首先,我将重新生成示例:

library(lattice)
set.seed(1)
d <- data.frame(x=runif(100), y=runif(100), grp=gl(5, 20))
可以看出,在
xyplot
命令中,我们要求不要绘制x轴(
draw=F
),但稍后面板调用
myPan
函数。在这里,我们特别要求为面板4和5绘制x轴

输出


希望它能为您提供一些改进方向。

以下是另一种基于@user20650(现已删除)答案中提供的代码的方法。它直接使用
网格
,将焦点集中在缺少轴(或至少假定为缺少轴)的活动网格图的面板上,然后添加它们。我们还假设x标度是固定的

功能(也作为要点存在):


对不起,我从答案<代码> Trel.Par。SET(剪辑=列表(面板=“off”))< /代码>中省略了这一行。这应该在xyplot命令之前。我编辑了答案,把它包括进去了。你可以添加<代码> Tr.Lab.Par。SET(剪辑=列表(Panel=“off”),Dealth.List=列表(Ax.xLab.Poad=3))< /C> >以避免沿着底部挤压标签“X”。谢谢。实际上,您不需要在
xyplot
调用中抑制轴-您可以将其简化为
xyplot(y~x | grp,d,as.table=TRUE,scales=list(tck=c(1,0),alternative=FALSE),panel=myPan)
。这也会对x轴标题进行排序。(在这种情况下,
if(panel.number()==5)
表达式可以从panel函数中删除。)对,因为它会自动发生。聪明,谢谢。@user20650-它非常方便。。。这个问题困扰了我好几年,但我从未花时间去解决它。再次感谢。
trellis.par.set(clip = list(panel = "off"))
myPan <- function(...){
    panel.xyplot(...)
    if(panel.number() == 4) {
        at = seq(0,1,by = 0.2)
        panel.axis("bottom", at = at, outside = T,
                    labels = T, half = F)
    }
    if(panel.number() == 5) {
        at = seq(0,1,by = 0.2)
        panel.axis("bottom",at = at, outside = T,
                   labels = T, half = F)
    }
}
xyplot(y~x|grp, d, as.table=TRUE, 
       scales = list(
           x = list(draw = F, relation="same"),
           y = list(tck=c(1,0), alternating=F)),
       layout = c(2,3),
       panel = myPan)
add_axes <- function() {
  library(grid)
  library(lattice)
  l <- trellis.currentLayout()
  pan <- which(l[nrow(l), ]==0)
  if(length(pan) > 0) {
    g <- grid.ls(print=FALSE)
    # use an existing panel as a template for ticks 
    ticks <- grid.get(g$name[grep("ticks.bottom.panel", g$name)][[1]])
    # use an existing panel as a template for labels
    labels <- grid.get(g$name[grep("ticklabels.bottom.panel", g$name)][[1]])
    ax <- grobTree(ticks, labels)
    invisible(sapply(pan, function(x) {
      trellis.focus("panel", x, nrow(l)-1, clip.off=TRUE)
      grid.draw(ax)
      trellis.unfocus()  
    }))
  }
}
library(lattice)
d <- data.frame(x=runif(100), y=runif(100), grp=gl(5, 20))
xyplot(y~x|grp, d, as.table=TRUE, scales=list(tck=c(1,0), alternating=FALSE), 
       layout=c(4, 2), xlim=c(-0.1, 1.1))
add_axes()