使用R 4.1.0的新`grid::pattern`函数,如何旋转图案

问题描述 投票:0回答:1

我正在研究

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 上

r graphics r-grid
1个回答
2
投票

这感觉像是一个错误;图案应该随视口旋转,但似乎虽然图案的每个实例都在旋转,但它们相对于视口的原点却没有旋转。这会导致图案错位。 解决方法是手动创建一个超过正方形大小的大型重复图案:

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)))

当然,这似乎违背了选择重复模式的目的。这可能是一种设计妥协,而不是本身的错误,但也许值得提交错误报告。

© www.soinside.com 2019 - 2024. All rights reserved.