2012-06-12 17 views
1

gridExtra程序包添加了一個類「pattern」的grob,它允許用矩形填充模式。例如,使用gridExtra和grid.pattern對齊面板上的圖案

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),此解決方案將不起作用。是否有更一般的修復?

+0

我如果不改變自己的(高度實驗性的)'patternGrob'的實現,不要認爲有一個簡單的答案。你能否描述你的問題的更一般的背景 - 你想要做什麼?這可能是因爲沒有使用這種不可靠的功能,更容易做到這一點。 – baptiste

+0

感謝您的回覆。真的,我想要做的就是用面板填充面板,並確保這些圖案無縫地跨面板排列。有關示例,請參閱下面的響應中的圖。 – user697473

回答

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) 

enter image description here

+0

謝謝 - 這個解決方案的作品。但它似乎意味着如果45度對角線要在面板上對齊,面板的高度必須至少爲5 * sqrt(2)= 7.071mm。那是對的嗎? – user697473

+1

@ user697473 - 這是正確的,如果您使用5mm的默認行間寬度(或「粒度」)。如果您更改了粒度(如[本示例](http://stackoverflow.com/questions/10987974/increasing-pattern-density-with-grid-pattern/10988301#10988301))和麪板高度一致,你可以得到不同高度的面板。 –