Раскрашивание объектов Безье

Благодарен, если кто-то может указать мне правильное направление, как раскрасить (заполнить) этот объект Безье, созданный сеткой. Функция gpar в документации, похоже, не действует.

require(grid)
x<-c(2,5,5,8,8,8,8,8,8,8,2,2)
y<-c(2,2,8,8,8,8,5,2,2,2,2,2)

grid.newpage()
pushViewport(plotViewport(xscale=c(0, 10), yscale=c(0, 10)))
grid.xaxis(); grid.yaxis()
grid.bezier(x, y, id=rep(1:3,each=4), default.units="native", gp=gpar(fill='red'))

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

Заранее спасибо.


person geotheory    schedule 16.10.2014    source источник
comment
может быть, вместо этого вы могли бы использовать xsplineGrob?   -  person baptiste    schedule 16.10.2014
comment
Выглядит осуществимо, но какая отвратительная недокументированная функция xsplineTest! Правильно ли я понимаю, что векторные аргументы s подавляют пользовательские точки Безье, чтобы заставить работать простое сегментное поведение?   -  person geotheory    schedule 16.10.2014
comment
без понятия, извините, я никогда не использовал ни один из них   -  person baptiste    schedule 16.10.2014
comment
@baptiste -- xsplineTest – это простая функция, определенная в разделе "Пример" документа ?xspline. (И что бы это ни стоило, мне это не кажется отвратительным, и я не понимаю, почему это должно быть задокументировано!) Его аргумент s соответствует/передается аргументу shape= xspline().   -  person Josh O'Brien    schedule 16.10.2014
comment
Возможно, отвратительно несправедливо, но ИМО делает понимание более трудным, чем должно быть. Почему бы просто не дать самую минимальную демонстрацию, как это делается в большинстве примеров R?   -  person geotheory    schedule 17.10.2014


Ответы (1)


Здесь решение с использованием xspline и базового графика R:

plot(x, y)
dd <- xspline(x, y, shape = 1,draw=FALSE)
xspline(x, y, shape = 1,draw=TRUE)
xx <- dd$x
yy <- dd$y
polygon(c(xx[1], xx, xx[1]), c(min(yy), yy, min(yy)),    
        col=rgb(1, 0, 0,0.5), border=NA)

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

Вы также можете сделать то же самое в стиле «сетка», используя grid.xspline . здесь я использую lattice, чтобы избежать головной боли в области просмотра:

dat <- data.frame(x=x,y=y)
library(lattice)
xyplot(y~x,data= dat , aspect = "xy",panel =function(x,y)
{

  grid.xspline(x,y,shape= 1,default.units="native",
     gp=gpar(fill='red'),open = FALSE)

})

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

person agstudy    schedule 16.10.2014
comment
Это большое спасибо agstudy. Мой единственный вопрос: знаете ли вы, почему небольшое изменение формы по сравнению с моим примером, то есть акцентирование Безье и добавление кривой в правом верхнем углу? - person geotheory; 17.10.2014
comment
@geotheory есть разница, потому что Безье использует приближение xspline. - person agstudy; 17.10.2014
comment
Спасибо еще раз. Внесены поправки в данные, чтобы сделать их более понятными. Я думаю, вам нужно изменить xx[n] на xx[1] в полигоне, чтобы это заработало. - person geotheory; 17.10.2014
comment
@geotheory, я исправил это. Как вы изменили данные? Извините, я не понимаю этого момента. - person agstudy; 17.10.2014
comment
Ничего особенного. Я просто изменил пару значений точки Безье, чтобы ваш код давал результаты, более похожие на grid.bezier, просто чтобы избежать путаницы. - person geotheory; 17.10.2014