2013-06-11 11 views
12

私はプロット領域(グラフがある領域)の幅と高さの25%を占めるプロット内にインセットを入れたいと思っています。Rプロットの「正立」にインセット(サブプロット)を追加するにはどうすればよいですか?

私が試み:

# datasets 
d0 <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5)) 
d0_inset <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5)) 

# ranges 
xlim <- range(d0$x) 
ylim <- range(d0$y) 

# plot 
plot(d0) 

# add inset 
par(fig = c(.75, 1, .75, 1), mar=c(0,0,0,0), new=TRUE) 
plot(d0_inset, col=2) # inset bottomright 

この絶対toprightにインセットを置き、また、デバイスの幅の25%を使用します。どのようにグラフのある領域の座標と幅に変更できますか?

+0

はたぶんでの作業します'layout()'(例えば、[here](http://www.statm ethods.net/advgraphs/layout.html))と 'xpd = TRUE'を組み合わせて使うことができます。 – Henrik

+0

プロット領域の寸法を示すコマンドがありました。 –

答えて

9

TeachingDemosパッケージのsubplot機能を見てください。それはあなたがやろうとしていることをより簡単にするかもしれません。ここで

は一例です:

私にとって
d0 <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5)) 
d0_inset <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5)) 

plot(d0) 
subplot( 
    plot(d0_inset, col=2, pch='.', mgp=c(1,0.4,0), 
    xlab='', ylab='', cex.axis=0.5), 
    x=grconvertX(c(0.75,1), from='npc'), 
    y=grconvertY(c(0,0.25), from='npc'), 
    type='fig', pars=list(mar=c(1.5,1.5,0,0)+0.1)) 

enter image description here

+0

'subplot'であっても、インセットのサイズを制御することは非常に難しいです:' x、y、size、vadj、hadjで定義された四角形が新しいプロットのプロット領域として使われます。すべての目盛り、軸ラベル、メインとサブタイトルはこの矩形の外側にあります。 ' –

+1

@Sven、デフォルトの '' plt''の代わりに 'type =' fig''を設定すると、すべてのラベル、ティックなど。指定された矩形の内側にあります。 –

+1

@Sven、上記の 'subplot'を使った例を追加しました。これはあなたのコメントのように右下のもの(他のコーナーへの変更が容易)と1/4の線形スペース(1/16thのエリア、また変更しやすい)を使いたいと思っていることを前提としています。 –

14

あなたはプロットの限界、ユーザ座標で を取得するpar("usr")を使用することができ、そしてgrconvert[XY]par(fig=...)でそれらを使用する前に、 (0と1の間で、NDC)正規化デバイス座標にそれら を変換します。

plot(d0) 
u <- par("usr") 
v <- c(
    grconvertX(u[1:2], "user", "ndc"), 
    grconvertY(u[3:4], "user", "ndc") 
) 
v <- c((v[1]+v[2])/2, v[2], (v[3]+v[4])/2, v[4]) 
par(fig=v, new=TRUE, mar=c(0,0,0,0)) 
plot(d0_inset, axes=FALSE, xlab="", ylab="") 
box() 

Topright inset

+2

いい例。私は、rect(u [2]、u [4]、(u [1] + u [2])/ 2、(u [3] + u [4])/ 2、 2番目の 'par'コマンドの前にinset領域を白く塗りつぶす(そして黒い境界を描き、' box'の必要性を排除します)。 –

4

作図領域の面積を見つけるために使用par("plt")(vincents答えに似ているようです)。 Strangely:figは、挿入図の描画領域のサイズを設定します。したがって、軸を表示すると、挿入図のサイズが25%より大きくなります。

# datasets 
d0 <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5)) 
d0_inset <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5)) 

# ranges 
xlim <- range(d0$x) 
ylim <- range(d0$y) 

# plot 
plot(d0) 

# calculate position of inset 
plotdim <- par("plt") 
xleft = plotdim[2] - (plotdim[2] - plotdim[1]) * 0.25 
xright = plotdim[2] # 
ybottom = plotdim[4] - (plotdim[4] - plotdim[3]) * 0.25 # 
ytop  = plotdim[4] # 

# set position for inset 
par(
    fig = c(xleft, xright, ybottom, ytop) 
    , mar=c(0,0,0,0) 
    , new=TRUE 
) 

# add inset 
plot(d0_inset, col=2) # inset bottomright 
1

はOCEライブラリから例を働いた: http://finzi.psych.upenn.edu/library/oce/html/plotInset.html

は、例を参照してください:

library(oce) 

## power law in linear and log form 
x <- 1:10 
y <- x^2 
plot(x, y, log='xy',type='l') 
plotInset(3, 1, 10, 8, 
      expr=plot(x,y,type='l',cex.axis=3/4,mgp=c(3/2,1/2,0)), 
      mar=c(2.5,2.5,1,1)) 

## CTD data with location 
data(ctd) 
plot(ctd, which="TS") 
plotInset(29.9, 2.7, 31, 10, 
      expr=plot(ctd, which='map', 
      coastline="coastlineWorld", 
      span=5000, mar=NULL, cex.axis=3/4)) 
関連する問題