1

私は純粋に で最初のステップを試みていますgridpairs()演習として、純粋に に基づいて( に似た) ペア プロットを作成したいと思いますgrid。以下の関数myplotGrobは、グリッド オブジェクト (grob; または gTree) を作成し、オブジェクトを返します。

どうやって続けるのが一番いいのかわからない。どの単位を使用する必要がありますか? (もやってみた"null"frameGrobレイアウトを設定するためのものですか?(これは、Paul Murrell の本から理解したものです) 目的のプロットが得られるように、ビューポートをどのように選択/調整する必要がありますか (これまでのところ、混乱しか見られません) (4, 4) プロット行列を取得するために、追加のパネルを段階的に「連結」する方がよいでしょうか?

require(grid)
require(mvtnorm)

set.seed(271)
X <- rmvnorm(1000, mean=1:4, sigma=diag(4:1)) # goal: draw this in a pairs plot

## auxiliary function
panel <- function(x, y) pointsGrob(x=x, y=y, name="panel", gp=gpar(), vp=NULL)

## creates and returns a gTree (class)
myplotGrob <- function(X, name=NULL, gp=NULL, vp=NULL)
{
    ## x-axis grob

    ## y-axis grob

    ## ...

    ## set up layout
    layout <- grid.layout(4, 4, # (4, 4) matrix
                          widths=rep(0.25, 4), heights=rep(0.25, 4),
                          default.units="npc")
    ## pushViewport(viewport(layout=layout)) # required???

    all <- frameGrob(layout=layout) # produces a gTree without children
    for(i in 1:4) {
        for(j in 1:4) {
            ## group grobs together
            gt <- gTree(X,
                        children=gList(panel(X[,i], X[,j])),
                        name=name, gp=gp, vp=vp, cl="myplotGrob")
            all <- placeGrob(all, gt, row=i, col=j)
        }
    }
    all
}

## draw the gTree
grid.myplot <- function(...) grid.draw(myplotGrob(...))

## call
grid.myplot(X)

アップデート

求められたので、これが私が念頭に置いている元の問題の設計/レイアウトです (上記は最小限の/学習例にすぎません)。cm単位は私だけのものでした(最終的には「相対的」である必要があります)。もちろん、パネルの数は異なる場合があります。グラフィックを作成する関数が(印刷/描画なしで)オブジェクトを返すように、すべてのパーツをグリッドオブジェクトにしたいと思います。このように、各パーツは後で変更できます。グラフィックは、次元 5 (またはそれ以下) の配列からの結果を表示する必要があります。1 つの次元が行パネル [ row.vars]、列パネル [ col.vars]、各パネルの x 軸[ ] に 1 つずつ表示されxvar、各パネルは配列の2つの異なる次元が含まれています(色と線の種類によって異なります)[私は使用dし、n図中]。もちろん、配列が 4 次元の場合、上記の設計の行 8 は欠落しているはずです。グリッドを介してレイアウトを構築することはできますが、問題はそこからどのように継続するかです。それが、上記の「最小限の例」で表現したかったことです。

ここに画像の説明を入力

4

2 に答える 2

2

grid.panel()と の基本的な例のように、タスクを 2 つの主要な部分に分けることができると思います。grid.multipanel()

1- gTree として返される単一のパネルを生成する関数を構築します。制限、軸、色、形状、グリッド、座標など、すべてのパラメータを把握する必要があります。ラティス パネルの関数と軸を書き直すことになるかもしれません。

grid.newpage()
grid::grid.panel(vp=viewport(width=0.8, height=0.8))

ここに画像の説明を入力

2-パネルをレイアウトで組み立てます。これは、gtable を使用するとはるかに簡単 (かつクリーン) です。

library(gtable)

grid.newpage()
lg <- replicate(16, grobTree(rectGrob(), pointsGrob()), simplify=FALSE)

gt <- gtable_matrix("pairs", grobs=matrix(lg, ncol=4),
                    widths=unit(rep(1, 4), "null"),
                    heights=unit(rep(1, 4), "null"))

gt <- gtable_add_col_space(gt, width=unit(0.5,"line"))
gt <- gtable_add_row_space(gt, height=unit(0.5,"line"))
gt <- gtable_add_padding(gt, padding=unit(1,"line"))

grid.draw(gt)

すべてをゼロから構築したい場合は、ここでも gtable のかなりの部分を作り直す必要があると思います。

ここに画像の説明を入力

于 2013-07-28T22:54:09.360 に答える
1

これは、gTree を返すことに似てgrid.multipanel()いますが、ペア プロットにより具体的な試みです。

require(grid)
require(mvtnorm)

set.seed(271)
X <- rmvnorm(100, mean=1:4, sigma=diag(4:1)) # goal: draw this in a pairs plot

panelGrob <- function(x=runif(10, -10, 10), y=runif(10, -10, 100), ...,
  xlim = range(x), ylim=range(y),
  axis.x=TRUE, axis.y=TRUE){
  xx <- pretty(x) ; yy <- pretty(y)
  xx <- xx[xx <= xlim[2] & xx >= xlim[1]]
  yy <- yy[yy <= ylim[2] & yy >= ylim[1]]

  r <- rectGrob()
  dvp <- dataViewport(xData=xx, yData=yy)
  p <- pointsGrob(x, y, pch=".", gp=gpar(col="red"), default.units="native",
                  vp = dvp)

  ax <- if(axis.x) xaxisGrob(at=xx, vp=dvp) else nullGrob()
  ay <- if(axis.y) yaxisGrob(at=yy, vp=dvp) else nullGrob()

  grobTree(r, ax, ay, p, ...)
}

grid.panel <- function(...)
  grid.draw(panelGrob(...))

grid.newpage()
grid.panel(vp=viewport(width=0.8, height=0.8))


pairsGrob <- function(X, ..., name=NULL, gp=NULL, vp=NULL){

  N <- NCOL(X)
  layout <- grid.layout(N+1, N+1, 
                        widths=unit(c(2, rep(1, N)), c("lines", rep("null", N))), 
                        heights = unit(c(rep(1, N), 2), c(rep("null", N), "lines")))


  wrap <- function(ii, jj, ...){
    panelGrob(X[,ii], X[,jj], ..., axis.x= ii == N, axis.y = jj == 1,
              vp=viewport(layout.pos.row=ii, layout.pos.col=jj+1))
  }

  rowcol <- expand.grid(ii=seq_len(N), jj=seq_len(N))
  gl <- mapply(wrap, ii=rowcol[,"ii"], jj=rowcol[,"jj"], MoreArgs=list(...),
               SIMPLIFY=FALSE)

  gTree(children=do.call(gList, gl), vp=viewport(layout=layout))
}

grid.pairs <- function(...) grid.draw(pairsGrob(...))

grid.newpage()
grid.pairs(X, xlim=c(-10,10), ylim=c(-10,10))

ここに画像の説明を入力

多くの問題がすでに明らかになっています。i) 適切なビューポートを追跡しながら、レイアウトに間隔を追加するのは面倒です。ii) パネル関数のほとんどのパラメーターはハードワイヤード (ポイント形状、色、グリッド、軸ラベルなど) であり、複雑さの爆発に備える必要がありargs(lattice::panel.xyplot)ます。iii) 軸の範囲は 1 行 / 列全体で一致する必要があります。これには、データをグループに適切に分割すること (ggplot2 または格子のファセット) について考える必要があります。iv) 凡例は、グリッドで再発明する別のものです。v) ...

于 2013-07-28T22:57:02.340 に答える