【问题标题】:aligning patterns across panels with gridExtra and grid.pattern()使用 gridExtra 和 grid.pattern() 跨面板对齐模式
【发布时间】:2012-06-12 22:17:01
【问题描述】:

gridExtra 包添加了一组“模式”类,可以让人们用模式填充矩形。例如,

library(gridExtra)
grid.pattern(pattern = 1)

创建一个用对角线填充的框。我想创建一堆面板,其中每个面板都用这些对角线填充。这很简单:

library(lattice); library(gridExtra)
examplePlot <- xyplot(
  1 ~ 1 | 1:2, 
  panel = function () grid.pattern(pattern = 1),
  layout = c(1, 2),

  # Remove distracting visual detail
  scales = list(x=list(draw=FALSE), y=list(draw=FALSE)),
  strip = FALSE, xlab = '', ylab = ''
)
print(examplePlot)

问题是对角线没有跨面板对齐。也就是说,在第一个面板的底部与第二个面板的顶部相交的地方存在一个视觉“中断”:在这一点上,线条没有对齐。这是我要解决的问题。

我可以通过在grid.pattern 调用中添加参数pattern.offset = c(.2005, 0) 来消除大部分视觉中断,并确保它仅适用于底部面板。但是这个解决方案并不能一概而论。例如,如果我更改模式(例如,通过使用 granularity 参数到 grid.pattern),此解决方案将不起作用。有更通用的解决方法吗?

【问题讨论】:

  • 如果不改变patternGrob 的(高度实验性的)实现,我认为没有一个简单的答案。您能否描述您问题的更一般背景 - 您要做什么?可能有一种更简单的方法可以做到这一点,而无需使用这个不可靠的功能。
  • 感谢您的回复。真的,我要做的就是用图案填充面板,并确保图案在面板之间无缝排列。例如,请参阅下面响应中的图。

标签: r graphics lattice


【解决方案1】:

要完成这项工作,您必须负责设置print.trellis 使用的panel.height 参数。 (要了解原因,请在运行示例代码后尝试调整绘图设备的大小:随着设备和面板的大小发生变化,线条的匹配/不匹配也会发生变化):

## Calculate vertical distance (in mm) between 45 degree diagonal lines
## spaced 5mm apart (the default distance for grid.pattern).
vdist <- 5 * sqrt(2)

nLines <- 8L    ## can be any integer
panelHeight <- list(x = nLines*vdist, units = "mm", data = NULL)

## Plot it
print(examplePlot, panel.height=panelHeight)

【讨论】:

  • 谢谢——这个解决方案有效。但是,如果要跨面板对齐 45 度对角线,这似乎意味着面板必须至少 5 * sqrt(2) = 7.071mm 高。对吗?
  • @user697473 -- 这是正确的,如果您使用 5 毫米的默认行间宽度(或“粒度”)。如果您更改粒度(如this example)和面板高度一致,您可以获得不同高度的面板。
猜你喜欢
  • 2011-04-15
  • 2020-12-17
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2013-01-23
  • 2014-12-01
相关资源
最近更新 更多