0

以前の質問で、新しいポイントを既存のグロブに追加する方法を尋ねたところ、新しいポイントのビューポートを指定する必要があることがわかりました。これは、コードが同じ環境で実行される場合に十分簡単です。次のような関数からグロブが返された場合:

getgrob = function(x, y) {
            require(grid)
            # x = 1:10
            # y = rnorm(10)
            plotvp = plotViewport(c(5, 5, 3, 3), name='plotvp')
            datavp = dataViewport(x, y, name='datavp')
            datapts = pointsGrob(x, y, pch=20, size=unit(1.3, 'mm'), name='datapts')
            xaxis = xaxisGrob()
            yaxis = yaxisGrob()
            xlab = textGrob('X Label', y=unit(-3, 'lines'), name='xlab')
            ylab = textGrob('Y Label', x=unit(-3, 'lines'), rot=90, name='ylab')
            plotbox = rectGrob()
            dataplot = gTree(children=gList(datapts,
                                            xaxis, yaxis,
                                            xlab, ylab,
                                            plotbox),
                             vp=datavp, name='dataplot')
            wholeplot = gTree(children=gList(dataplot),
                              vp=plotvp, name='wholeplot')
            wholeplot
        }

myplot = getgrob(1:10, rnorm(10))

今、私はいくつかの新しいポイントを持っています:

x = 1:10
y = rnorm(10)/2

datavpこれらのポイントを追加するにはビューポートが必要ですが、これはmyplotグロブを介してのみ利用できます。この場合、ビューポートにアクセスするにはどうすればよいですか?

4

1 に答える 1

0

Grob は単なるリストです。そこから vp 要素を簡単に抽出できることがわかりました。

getgrob = function(x, y) {
    require(grid)
    x = 1:10
    y = rnorm(10)
    plotvp = plotViewport(c(5, 5, 3, 3), name='plotvp')
    datavp = dataViewport(x, y, name='datavp')
    datapts = pointsGrob(
                         x, y, pch=20,
                         size=unit(2.3, 'mm'),
                         name='datapts',
                         gp=gpar(col='black')
                         )
    xaxis = xaxisGrob()
    yaxis = yaxisGrob()
    xlab = textGrob('X Label', y=unit(-3, 'lines'), name='xlab')
    ylab = textGrob('Y Label', x=unit(-3, 'lines'), rot=90, name='ylab')
    plotbox = rectGrob()
    dataplot = gTree(children=gList(datapts,
                                    xaxis, yaxis,
                                    xlab, ylab,
                                    plotbox),
                     vp=datavp, name='dataplot')
    wholeplot = gTree(children=gList(dataplot),
                      vp=plotvp, name='wholeplot')
    wholeplot
}

pdf('/tmp/a.pdf')
# png('/tmp/a.png')
mygrob = getgrob(1:10, rnorm(10))
grid.draw(mygrob)
dev.off()

x = 1:10
y = rnorm(1:10)/2
newpoints = pointsGrob(x, y,
                       vp=mygrob$children$dataplot$vp,
                       default.units='native',
                       pch=20, size=unit(2.3, 'mm'),
                       gp=gpar(col='green'))
mygrob = addGrob(mygrob, newpoints)

pdf('/tmp/b.pdf')
# png('/tmp/b.png')
grid.draw(mygrob)
dev.off()

ここに画像の説明を入力 ここに画像の説明を入力

于 2013-10-24T09:50:50.120 に答える