2012-04-02 9 views
8

非常に簡単な例として、mfrow=c(1,3)を入力してください。各図は異なるヒストグラムです。 すべて 3フィギュアを横切った横線(abline(h=10)に似ています)を描くにはどうすればよいですか? (つまり、それらの間のマージンさえも)明らかに、私は各図にアブラインを追加することができますが、それは私が望むものではありません。私はで実際にという数字を1つしか持たず、polygonなどを使ってそれぞれの数字を描くという非常に複雑な方法を考えることができます。それはばかげているでしょう。これを行う簡単な方法はありませんか?Rのマルチフィギュア環境にどのように線を描くのですか?

答えて

13

@joranが指摘したように、グリッドグラフィカルシステムをより柔軟に提供しています1つのデバイス上の複数のプロットの配置を制御します。

ここでは、y軸の高さ50の位置をに照会し、「正規化されたデバイス座標」の単位で照会します。 (すなわち、プロット装置の全高の割合として、0 =底部、および1 =上部)。次に、グリッドを使用して、(1)デバイスをいっぱいにするviewportを押します。 (2)grconvertY()によって返された高さの線をプロットする。

## Create three example plots 
par(mfrow=c(1,3)) 
barplot(VADeaths, border = "dark blue") 
barplot(VADeaths, border = "yellow") 
barplot(VADeaths, border = "green") 

## From third plot, get the "normalized device coordinates" of 
## a point at a height of 50 on the y-axis. 
(Y <- grconvertY(50, "user", "ndc")) 
# [1] 0.314248 

## Add the horizontal line using grid 
library(grid) 
pushViewport(viewport()) 
grid.lines(x = c(0,1), y = Y, gp = gpar(col = "red")) 
popViewport() 

enter image description here

EDIT:@joranは、第三プロットの最後のバーの端に第一プロットのy軸から延びているラインをプロットする方法を尋ねました。

library(grid) 
library(gridBase) 
par(mfrow=c(1,3)) 

# barplot #1 
barplot(VADeaths, border = "dark blue") 
X1 <- grconvertX(0, "user", "ndc") 
# barplot #2 
barplot(VADeaths, border = "yellow") 
# barplot #3 
m <- barplot(VADeaths, border = "green") 
X2 <- grconvertX(tail(m, 1) + 0.5, "user", "ndc") # default width of bars = 1 
Y <- grconvertY(50, "user", "ndc") 

## Horizontal line 
pushViewport(viewport()) 
grid.lines(x = c(X1, X2), y = Y, gp = gpar(col = "red")) 
popViewport() 

enter image description here

最後に、ここにほとんど同等の、より一般的に有用なアプローチです:ここでの選択肢のカップルです。あなたの助けのために

library(grid) 
library(gridBase) 
par(mfrow=c(1,3)) 

barplot(VADeaths); vps1 <- do.call(vpStack, baseViewports()) 
barplot(VADeaths) 
barplot(VADeaths); vps3 <- do.call(vpStack, baseViewports()) 

pushViewport(vps1) 
Y <- convertY(unit(50,"native"), "npc") 
popViewport(3) 

grid.move.to(x = unit(0, "npc"), y = Y, vp = vps1) 
grid.line.to(x = unit(1, "npc"), y = Y, vp = vps3, 
      gp = gpar(col = "red")) 
+0

+1ニース!あなたは、ラインが緑色のバーの左端からy軸に沿って延びるようにユニット/座標/クリッピングをマッサージする方法を知っていますか? – joran

+0

私は考えがあります、それがうまくいくなら、私はそれを追加します。今、私は太陽が沈む前に芝生を刈るために出かけています... –

+0

ありがとう、これは本当に役立ちます! – gung

6

これは私が難しく考えずにできる最善である:

par(mfrow = c(1,3),xpd = NA) 

for (i in 1:3){ 
    x <- rnorm(200,i) 
    hist(x) 
    if (i == 1) segments(par("usr")[1],10,30,10) 
} 

enter image description here

私はラインをいじりせずに適切な場所で終わることを確認するかどうかはわかりません。各地域にセグメントをプロットすることでそれを解決できますが、高さを適切に整えるという問題を導入します。しかし、少なくともこれは良い出発点かもしれません。

私はこれがグリッドグラフィックスでより簡単だと思いますが、私は検証するためにいくつかの研究を行う必要があります。

+0

ありがとう:それは機能の@ mdsumnerの答えににリンクされている記事のポール・マレルでデモを行っgrid.move.to()grid.line.to()を採用しています。 – gung

4

ポール・マレルによってこの資料は、2つの別々のサブプロットのネイティブ空間で指定されたエンドポイントを有する2つの異なるこの場合には、座標系の線の間の線描画するgridグラフィックスの使用を示しています。

ポール・マレルを。グリッドグラフィックスパッケージ。 Rニュース、2(2):14-19、2002年6月

これは、PDF記事の17ページにあります:

http://cran.r-project.org/doc/Rnews/Rnews_2002-2.pdf

+0

ありがとう、私は記事を読んでいます。 – gung

+0

ええ、その素晴らしいリンクをありがとう。 Murrellの記事で実証されている関数( 'grid.move.to()'と 'grid.line.to()')を使用して、私の答えに3番目のコードブロックを追加しました。 –

関連する問題