20

@backlinによる紹介

layoutまたはを使用して、複数の単純なプロットを 1 つの図のパネルとして組み合わせることができますpar(mfrow=...)。ただし、より複雑なプロットは、独自のパネル レイアウトを内部的にセットアップして、パネルとして使用できないようにする傾向があります。ネストされたレイアウトを作成し、複雑なプロットを単一のパネルにカプセル化する方法はありますか?

gridたとえば、パネルを別々のビューポートにプロットすることで、パッケージがこれを達成できると感じていますが、その方法を理解できていません。問題を示すおもちゃの例を次に示します。

my.plot <- function(){
    a <- matrix(rnorm(100), 10, 10)
    plot.new()
    par(mfrow=c(2,2))
    plot(1:10, runif(10))
    plot(hclust(dist(a)))
    barplot(apply(a, 2, mean))
    image(a)
}
layout(matrix(1:4, 2, 2))
for(i in 1:4) my.plot()
# How to avoid reseting the outer layout when calling `my.plot`?

@alittleboy による元の質問

heatmap.2パッケージの関数を使用してgplotsヒートマップを生成します。単一のヒートマップのサンプル コードを次に示します。

library(gplots)
row.scaled.expr <- matrix(sample(1:10000),nrow=1000,ncol=10)
heatmap.2(row.scaled.expr, dendrogram ='row',
          Colv=FALSE, col=greenred(800), 
          key=FALSE, keysize=1.0, symkey=FALSE, density.info='none',
          trace='none', colsep=1:10,
          sepcolor='white', sepwidth=0.05,
          scale="none",cexRow=0.2,cexCol=2,
          labCol = colnames(row.scaled.expr),                 
          hclustfun=function(c){hclust(c, method='mcquitty')},
          lmat=rbind( c(0, 3), c(2,1), c(0,4) ), lhei=c(0.25, 4, 0.25 ),                 
)

ただし、1 つのプロットで複数のヒートマップを比較したいので、使用してから4 回par(mfrow=c(2,2))呼び出します。heatmap.2

row.scaled.expr <- matrix(sample(1:10000),nrow=1000,ncol=10)
arr <- array(data=row.scaled.expr, dim=c(dim(row.scaled.expr),4))
par(mfrow=c(2,2))
for (i in 1:4)
heatmap.2(arr[ , ,i], dendrogram ='row',
          Colv=FALSE, col=greenred(800), 
          key=FALSE, keysize=1.0, symkey=FALSE, density.info='none',
          trace='none', colsep=1:10,
          sepcolor='white', sepwidth=0.05,
          scale="none",cexRow=0.2,cexCol=2,
          labCol = colnames(arr[ , ,i]),                 
          hclustfun=function(c){hclust(c, method='mcquitty')},
          lmat=rbind( c(0, 3), c(2,1), c(0,4) ), lhei=c(0.25, 4, 0.25 ),                 
)

ただし、結果は 1 つのプロットに 4 つのヒートマップではなく、4 つの個別のヒートマップになります。つまり、pdf()結果を出力するために使用すると、ファイルは 1 ページではなく 4 ページになります。どこかでパラメータを変更する必要がありますか? どうもありがとう!

4

4 に答える 4

20

わかった。この質問は、長い回答を書き上げなければならないほど長い間回答されていないと思います。

最も困難なグラフィックスの問題に対する答えは、(@backlin が示唆するように) 'grid' パッケージをそのまま使用することです。多くのビルド済みグラフィックス パッケージは、現在のビューポートとプロット デバイスの設定をすべてオーバーライドするため、特定の方法で何かを実行したい場合は、自分でビルドする必要があります。

Paul Murrell の著書 "R Graphics" を手に取り、'grid' パッケージの章を読むことをお勧めします。とてつもなく便利な本で、私の机の上にいつも 1 冊置いてあります。

ヒートマップについては、すぐに始められるように簡単な入門書を作成しました。

知っておきたい機能

  • grid.newpage() これにより、プロッティング デバイスが初期化されます。パラメータなしで使用します。
  • grid.rect() これで長方形が描画されます。ヒートマップは基本的に、色付きの長方形の巨大なセットにすぎないため、これがグラフィックの大部分になります。次のように動作します: grid.rect(x=x_Position, y=y_Position, width=width_Value, height=height_Value, gp=gpar(col=section_Color, fill=section_Color), just=c("left", "bottom"), default.units="native") 'just' 引数は、指定した (x, y) 座標に配置する四角形の点を指定します。
  • grid.text() これはテキストを描画します。次のように機能します。grid.text("Label Text", x_Value, y_Value, gp=gpar(col=color_Value, cex=font_Size), just=c("right","center"), rot=rot_Degrees, default.units="native")
  • grid.lines() これで一線を画します。次のように機能します。grid.lines(c(x_Start,x_End), c(y_Start, y_End), gp=gpar(col=color_Value), default.units="native")
  • dataViewport() これは、「グリッド」が「ビューポート」と呼ばれるプロット ウィンドウの属性を定義します。次のように使用してください:pushViewport(dataViewport(xData=x_Data, yData=y_Data, xscale=c(x_Min, x_Max), yscale=c(y_Min, y_Max), x=x_Value, y=y_Value, width=width_Value, height=height_Value, just=c("left","center"))) ここで留意すべき点がいくつかあります... ビューポートの詳細な説明を参照してください。
  • pushViewport() これは、veiwport を初期化するために使用されます。これをビューポート定義にラップして、実際にビューポートを実行します。次のようにします。pushViewport(dataViewport([stuff in here]))
  • popViewport() これにより、ビューポートが完成し、ビューポートの階層で 1 レベル上に移動します。ビューポートの詳細な説明を参照してください。

ビューポートの概要

ビューポートは、「グリッド」オブジェクトを描画する場所と方法を定義する一時的な描画スペースです。ビューポート内のすべてのものは、ビューポートに対して相対的に描画されます。ビューポートが回転すると、内部のすべてが回転します。ビューポートは入れ子にすることができ、オーバーラップすることができ、ほぼ無限に柔軟ですが、例外が 1 つあります。ビューポートは常に長方形です。

多くの人が最初に困惑するのは座標系です。最初の「grid.newpage()」ビューポートを含むすべてのビューポートは、x 軸と y 軸の両方で 0 から 1 になります。原点 (0,0) は左下隅であり、最大 (1,1) は右上隅です。これは「npc」単位系であり、単位のセットが指定されていないものはすべて、この系に従って描画される可能性があります。これは、次の 2 つのことを意味します。

  1. ビューポートのサイズと位置を指定するときは、「npc」システムを使用します。ビューポートで「npc」座標を使用する必要があると仮定してください。そうすれば、多くの手間を省くことができます。つまり、2 つのプロットを並べて描画する場合、2 つのビューポートの定義は次のようになります。
    • viewport(x=0, y=0, width=0.5, height=1, just=c("left","lower"))
    • viewport(x=0.5, y=0, width=0.5, height=1, just=c("left","lower"))
  2. ビューポートの座標系が異なる場合 (たとえば、グラフをプロットするためのビューポート)、描画するすべての「グリッド」オブジェクトに対して「default.units」引数を指定する必要があります。たとえば、点を (2,4) にプロットしようとすると、画面から遠く離れているため、点が表示されません。指定default.units="native"すると、ビューポート独自の座標系を使用するようにそのポイントが指示され、ポイントが正しく描画されます。

ビューポートはナビゲートして直接書き込むことができますが、非常に自動化された操作を行う場合を除き、ビューポートを指定してその内部に描画し、ビューポートを「ポップ」(ファイナライズ) する方が簡単です。これにより、親ビューポートに戻り、次のビューポートから開始できます。各ビューポートをポップすることは、整理整頓されたアプローチであり、ほとんどの目的に適しています (そして、デバッグが容易になります!)。

グラフをプロットする場合、「dataViewport」関数はすべて重要です。これは、使用しているデータを指定する限り、すべての座標とスケールを処理する特別なタイプのビューポートです。これは、私がプロット領域に使用するものです。最初に「grid」パッケージを使い始めたとき、「npc」座標系に合うようにすべての値を調整しましたが、それは間違いでした! 「dataViewport」関数は、各描画アイテムに「ネイティブ」単位を使用することを覚えている限り、すべて簡単です。

免責事項

データ ビジュアライゼーションは私の得意分野であり、優れたビジュアルのスクリプト作成に半日を費やしてもかまいません。'grid' パッケージを使用すると、非常に洗練されたビジュアルを他の何よりも高速に作成できます。さまざまなデータをすばやくロードできるように、ビジュアルを関数としてスクリプト化しています。これ以上ないほど幸せです。

ただし、スクリプトを作成するのが苦手な場合は、「グリッド」が敵になります。また、半日では視覚化に時間がかかりすぎると考える場合、「グリッド」はあまり役に立ちません。(悪名高い) 有名な 'ggplot2' パッケージは、ほとんどの人が落ち着くものであり、個人的には便利だとは思いませんが、心からお勧めします。

「グリッド」グラフィックスの学習を手伝ってほしい人がいれば、喜んで教えます。高速でインテリジェントな見栄えの良いデータ ビジュアルを作成する私の能力に完全に革命をもたらしました。

于 2013-01-28T17:07:20.280 に答える
10

gridGraphicsパッケージが役立つかもしれませんが、

ここに画像の説明を入力

library(gridGraphics)
library(grid)

grab_grob <- function(){
  grid.echo()
  grid.grab()
}

arr <- replicate(4, matrix(sample(1:100),nrow=10,ncol=10), simplify = FALSE)

library(gplots)
gl <- lapply(1:4, function(i){
  heatmap.2(arr[[i]], dendrogram ='row',
            Colv=FALSE, col=greenred(800), 
            key=FALSE, keysize=1.0, symkey=FALSE, density.info='none',
            trace='none', colsep=1:10,
            sepcolor='white', sepwidth=0.05,
            scale="none",cexRow=0.2,cexCol=2,
            labCol = colnames(arr[[i]]),                 
            hclustfun=function(c){hclust(c, method='mcquitty')},
            lmat=rbind( c(0, 3), c(2,1), c(0,4) ), lhei=c(0.25, 4, 0.25 ),                 
  )
  grab_grob()
})

grid.newpage()
library(gridExtra)
grid.arrange(grobs=gl, ncol=2, clip=TRUE)
于 2015-08-02T03:15:48.667 に答える
2

Dinre が言ったように、「グリッド」パッケージはすべての複雑なプロットを処理できます。@alittleboy による元の質問については、Bionconductor のパッケージ「ComplexHeatmap」(これもグリッドに基づいています) が良い解決策になると思います ( http://www.bioconductor.org/packages/release/bioc/vignettes/ComplexHeatmap /inst/doc/ComplexHeatmap.html )

于 2015-08-02T02:10:22.923 に答える