我正在研究
grid
的新模式功能。到目前为止,我可以绘制一个矩形:
library(grid)
# Note that using absolute coordinates like "cm" for
# x and y does not work
cross <- grobTree(
linesGrob( x= unit(c(0,1),"npc"), y= unit(c(0,1),"npc")),
linesGrob( x= unit(c(0,1),"npc"), y= unit(c(1,0),"npc")))
cpat <- pattern(cross,
width = unit(1,"cm"),
height = unit(1,"cm"),
extend = "repeat")
rect <- rectGrob(
width = unit(5, "cm"),
height = unit(5, "cm"),
gp= gpar(fill = cpat))
grid.newpage()
grid.draw(rect)
但是我无法旋转我的物体而不弄乱:
grid.newpage()
grid.draw(grobTree(rect,vp=viewport(angle=20)))
而且我也无法旋转对象内部的图案,因为每次它都不会旋转重复图案的方向:
vp <- viewport(angle = 30)
cross <- grobTree(
linesGrob( x= unit(c(0,1),"npc"), y= unit(c(0,1),"npc")),
linesGrob( x= unit(c(0,1),"npc"), y= unit(c(1,0),"npc")),
vp = vp)
cpat <- pattern(cross,
width = unit(1,"cm"),
height = unit(1,"cm"),
extend = "repeat")
rect <- rectGrob(
width = unit(5, "cm"),
height = unit(5, "cm"),
gp= gpar(fill = cpat))
grid.newpage()
grid.draw(rect)
如何旋转图案重复的方向?
编辑:这是在 R 4.3.1 上
这感觉像是一个错误;图案应该随视口旋转,但似乎虽然图案的每个实例都在旋转,但它们相对于视口的原点却没有旋转。这会导致图案错位。 解决方法是手动创建一个超过正方形大小的大型重复图案:
library(grid)
cross <- do.call('grobTree', c(
lapply(seq(-5, 5, 0.1), function(x) {
linesGrob(x = c(0, 1) + x, y = c(0, 1))
}),
lapply(seq(-5, 5, 0.1), function(x) {
linesGrob(x = c(0, 1) + x, y = c(1, 0))
})))
cpat <- pattern(cross,
width = unit(15, "cm"),
height = unit(15, "cm"),
extend = 'none')
rect <- rectGrob(
width = unit(5, "cm"),
height = unit(5, "cm"),
gp = gpar(fill = cpat))
grid.newpage()
grid.draw(rect)
grid.newpage()
grid.draw(grobTree(rect, vp = viewport(angle = 20)))
当然,这似乎违背了选择重复模式的目的。这可能是一种设计妥协,而不是本身的错误,但也许值得提交错误报告。