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

Несколько функций в базовой графической системе 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)

введите описание изображения здесь

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

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

введите описание изображения здесь

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


person Josh O'Brien    schedule 29.09.2014    source источник
comment
это невозможно. Однако это возможно через gridSVG (grid.patternFill)   -  person baptiste    schedule 30.09.2014
comment
@baptiste - Полезно знать. Исходя из вашего мнения, я приму это как + / окончательное. Также спасибо за указатель на эту функцию gridSVG.   -  person Josh O'Brien    schedule 30.09.2014
comment
Я никогда особо не пробовал, и, думаю, это относительно недавно. Вот пример: stat.auckland.ac.nz /~paul/Talks/London2013/barchart/barchart.R   -  person baptiste    schedule 30.09.2014
comment
@baptiste К сожалению, мне это нужно в формате pdf, поэтому мне, возможно, придется преобразовать свои полигоны в растр и использовать его в качестве маски для извлечения шаблона из другого растрового изображения (как показано в эта статья Пола Мюррела в R-Journal). Похоже, ваш gridExtra::rpatternGrob может оказаться полезным, если я пойду в этом направлении.   -  person Josh O'Brien    schedule 30.09.2014
comment
Я настоятельно рекомендую не использовать (r) patternGrob, они безнадежны (и не будут работать для обычных многоугольников, только прямоугольников)   -  person baptiste    schedule 30.09.2014
comment
В качестве альтернативы, поскольку я на самом деле имею дело с пространственными данными (а мои многоугольники уже SpatialPolygons), я полагаю, что могу построить объект SpatialLines и использовать rgeos для его пересечения с моими многоугольниками. Теоретически это даст общий (хотя и довольно окольный) способ получить штриховку для полигонов.   -  person Josh O'Brien    schedule 30.09.2014
comment
лично я бы попробовал преобразовать SVG в PDF, возможно, некоторые недавние инструменты или даже Inkscape могут делать достойную работу.   -  person baptiste    schedule 30.09.2014


Ответы (1)


Вот пример gridSVG, адаптированный из презентации Пола Мюррелла

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

введите описание изображения здесь

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

введите описание изображения здесь

person baptiste    schedule 29.09.2014
comment
Заштрихованные гистограммы ДА! :-) +1 - person Tyler Rinker; 30.09.2014
comment
у меня как-то не работает, R версия 3.3.0 и сетка 3.3.0, gridSVG 1.5-0 - person xealits; 24.06.2016
comment
@baptiste вы знаете, как сохранить это в PDF (не SVG) - person Eugeny89; 18.09.2017