сетка: как указать ограничения, чтобы избежать вывода grid.points() за пределы области просмотра?

Я только что попробовал свои первые шаги с grid. Я хотел бы настроить матрицу 2 x 2 квадратных диаграмм рассеяния с некоторым пространством между ними. Чтобы получить пространство, я фактически использую макет 3 x 3 (Вопрос 1: есть ли более простой способ?). Как видно из приведенного ниже примера, точки нанесены за пределы ограничивающего прямоугольника. Я как-то должен указать пределы в сюжете. Вопрос 2: Как это можно сделать? Наконец, могу ли я использовать базовую графику для создания графиков? [Я знаю, что lattice графика будет работать, а также можно использовать стандартную layout (или ggplot2), но мне интересно, возможно ли это и с grid.layout]

require(grid)

## generate data to be plotted in the top left plot
X <- matrix(rexp(2000), ncol=2)

## plot device
file <- "foo.pdf"
pdf(file=file, width=10, height=10)

## set up grid.layout
gl <- grid.layout(3, 3, respect=rbind(c(0,1,0), c(1,1,1), c(0,1,0)),
                  widths=unit(c(3,1,3), "inches"), heights=unit(c(3,1,3), "inches")) # define grid layout

pushViewport(viewport(layout=gl)) # use this layout in a viewport

## (1,1) plot
pushViewport(viewport(layout.pos.row=1, layout.pos.col=1, name="11"))
grid.points(X[,1], X[,2], pch=1) # points
grid.rect() # bounding rectangle
grid.xaxis() # x-axis
grid.yaxis() # y-axis
grid.text(expression(italic(X[1])), y=unit(-3, "lines")) # x-axis label
grid.text(expression(italic(X[2])), x=unit(-3, "lines"), rot=90) # y-axis label
grid.text("Plot 1", x=0.86, y=0.9, gp=gpar(fontface="bold", cex=1.6)) # add label
upViewport()

## (1,2) plot
pushViewport(viewport(layout.pos.row=1, layout.pos.col=3, name="13"))
grid.rect()
upViewport()

## (2,1) plot
pushViewport(viewport(layout.pos.row=3, layout.pos.col=1, name="31"))
grid.rect()
upViewport()

## (2,2) plot
pushViewport(viewport(layout.pos.row=3, layout.pos.col=3, name="33"))
grid.rect()
upViewport()

## plot device
dev.off()

person Marius Hofert    schedule 18.06.2012    source источник
comment
использовать clip = TRUE в окне просмотра?   -  person baptiste    schedule 19.06.2012
comment
см. также dataViewport и grid.multipanel()   -  person baptiste    schedule 19.06.2012
comment
отсечение обрезает область; Я хочу, чтобы все данные были показаны. ?grid.multipanel дает мне только grid-internal, который не следует использовать (как было сказано). Я пытался использовать pushViewport(dataViewport(X[,1], X[,2])) после pushViewport в (1.1), но получил Error in push.vp.default(X[[1L]], ...) : Only valid to push viewports   -  person Marius Hofert    schedule 19.06.2012
comment
посмотрите на источник grid.multipanel и grid.panel, чтобы увидеть, как Пол Мюррелл подходит к этой проблеме.   -  person baptiste    schedule 19.06.2012
comment
для последнего вопроса: см. пакет gridBase, но учтите, что совместимость между базовой графикой и сеткой не всегда гарантируется.   -  person baptiste    schedule 19.06.2012


Ответы (1)


У вас должна быть правильная система координат: либо конвертируйте ваши данные в единицы «npc», либо настройте окно просмотра с собственными единицами, полученными из ваших данных,

pushViewport(dataViewport(X[,1], X[,2], 
               layout.pos.row=1, layout.pos.col=1, name="11"))

работает как положено.

Что касается вопроса 1, взгляните на пакет gtable на github; он разрабатывается, чтобы облегчить подобные вещи для ggplot2 и других графических фреймворков на основе сетки.

person baptiste    schedule 18.06.2012
comment
Бинго. Я как раз собирался опубликовать этот же совет. Кроме того, первый пример в разделе 4 раздела vignette("grid") является хорошей демонстрацией того, как использовать dataViewport() и plotViewport() для построения простой диаграммы рассеяния. - person Josh O'Brien; 19.06.2012