Как применить кросс-штриховку к многоугольнику с использованием графической системы сетки?

Несколько функций в базовой графической системе R, включая rect() и polygon(), поддерживают кросс-штриховку через их аргументы angle= и density=:

x = c(0, 0.5, 1, 0.5)
y = c(0.5, 1, 0.5, 0)
par(mar=c(0,0,0,0))
plot.new()
polygon(x, y, angle=45, density=10)

enter image description here

Как я могу применить аналогичную кросс-штриховку к многоугольнику, нарисованному графической системой сетки grid.polygon():

library(grid)
grid.newpage()
grid.polygon(x,y)

enter image description here

Я просмотрел документацию для ?grid.polygon и ?gpar, и просмотрел книгу Пола Мюррела по графике R и до сих пор дошел до пустого. Мне что-то не хватает? Если нет, есть ли простой хак, который сделает это возможным?

Ответ 1

Вот пример с gridSVG, адаптированный из презентации Paul Murrell

library(gridSVG)
library(grid)
x = c(0, 0.5, 1, 0.5)
y = c(0.5, 1, 0.5, 0)
grid.newpage()
grid.polygon(x,y, name="goodshape")

pat <- pattern(linesGrob(gp=gpar(col="black",lwd=3)),
  width = unit(5, "mm"), height = unit(5, "mm"),
  dev.width = 1, dev.height = 1)

# Registering pattern
registerPatternFill("pat", pat)
# Applying pattern fill
grid.patternFill("goodshape", label = "pat")

grid.export("test-pattern.svg")

enter image description here

допускаются более сложные гниль, так как svg заботится об отсечении.

enter image description here