【问题标题】:exact positioning of plots with grid.layout使用 grid.layout 精确定位地块
【发布时间】:2018-08-03 00:49:54
【问题描述】:

我有两个格子图。我需要将一个放在另一个之上,并且我需要在它们之间恰好有 0.5" 的垂直空间。我的想法是使用 grid.layout 来指定三行布局,中间行正好是 0.5" 高。然后我可以将一个图打印到顶行,将另一个图打印到底行。

它几乎可以工作了。问题是我不能让中间行正好是 0.5 英寸高。这是一个最小的例子:

pdf(file='example.pdf', height=12)

# Create layout and viewports
masterLayout <- grid.layout(
  nrow    = 3, 
  ncol    = 1, 
  heights = unit(c(1, .5, 1), c("null", "inches", "null")),
  respect = matrix(c(0, 1, 0)))
vp1 <- viewport(layout.pos.row=1, just=c("center", "bottom"))  
vp2 <- viewport(layout.pos.row=3, just=c("center", "top"))     

# Create plots
plot1 <- xyplot(1 ~ 1, panel = function () grid.rect(gp=gpar(fill="black")))
plot2 <- xyplot(1 ~ 1, panel = function () grid.rect(gp=gpar(fill="red")))       

# Push viewports and print plots
pushViewport(viewport(layout = masterLayout))
pushViewport(vp1)
print(plot1, newpage = FALSE)
upViewport()
pushViewport(vp2)
print(plot2, newpage = FALSE)

dev.off()

我在这个例子中尝试了很多变化,但我无法将绘图之间的距离固定为 0.5"。有没有办法做到这一点?

更新: 下面巴蒂斯特的回答很好。另请参阅 Deepayan Sarkar 在https://stat.ethz.ch/pipermail/r-help/2012-June/316178.html 的回答。

【问题讨论】:

    标签: r lattice r-grid


    【解决方案1】:

    试试这个:

    library(lattice)
    # Create layout and viewports
    masterLayout <- grid.layout(
      nrow    = 3, 
      ncol    = 1, 
      heights = unit(c(1, .5, 1), c("null", "inches", "null")),
      respect = matrix(c(0, 1, 0)))
    vp1 <- viewport(layout.pos.row=1,  name="vp1")  
    vp2 <- viewport(layout.pos.row=3,  name="vp2")     
    vp3 <- viewport(layout.pos.row=2,  name="spacer")     
    
    theme.novpadding <-
       list(layout.heights =
            list(top.padding = 0,
            main.key.padding = 0,
            key.axis.padding = 0,
            axis.xlab.padding = 0,
            xlab.key.padding = 0,
            key.sub.padding = 0,
            bottom.padding = 0),
            layout.widths =
            list(left.padding = 0,
            key.ylab.padding = 0,
            ylab.axis.padding = 0,
            axis.key.padding = 0,
            right.padding = 0))
    
    # Create plots
    plot1 <- xyplot(1 ~ 1, panel = function () grid.rect(gp=gpar(fill="black")),
       scales=list(axs='i',draw=FALSE),
       xlab=NULL,ylab=NULL,par.settings = theme.novpadding)
    plot2 <- xyplot(1 ~ 1, panel = function () grid.rect(gp=gpar(fill="red")),
       scales=list(axs='i',draw=FALSE),
       xlab=NULL,ylab=NULL,par.settings = theme.novpadding)       
    
    grid.newpage()
    pushViewport(vpTree(viewport(layout = masterLayout,name="master"), vpList(vp1, vp2, vp3)))
    seekViewport("master")
    print(plot1, draw.in = "vp1")
    print(plot2, draw.in = "vp2")
    seekViewport("spacer")
    grid.rect()
    

    【讨论】:

    • 非常感谢。我试过你的代码,它工作。但我注意到它仅在 panel.height 未指定时才有效。比如我只把print(plot1, draw.in = "vp1")改成print(plot1, draw.in = "vp1", panel.height=list(x=1, units="in")),矩形之间的空间一下子就占了0.5”多。问题是vp1底部没有绘制plot1(即顶部矩形)。是当为一个或两个图指定 panel.height 时,有没有办法使示例工作?
    • 不幸的是,我没有使用足够多的格子来了解这一点;它似乎用视口做有趣的事情。如果我是你,我会在 r-help 上询问 Deepayan S.。
    • 再次感谢。我给 r-help 发了一条消息;如果我得到回复,我会在这里发布一个链接。
    猜你喜欢
    • 2013-04-26
    • 2021-06-09
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2011-03-24
    • 2011-12-10
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多