5

Rで2 x 2の配置で4つの散布図をプロットしようとしています(実際にはrpy2を介してプロットしています)。それぞれのアスペクト比を 1 にするだけでなく、同じスケールにしたいので、すべてのサブプロットで同じ X と Y の目盛りを比較できるようにします。私はこれをやろうとしましたpar:

par(mfrow=c(2,2))
# scatter 1
plot(x, y, "p", asp=1)
# scatter 2
plot(a, b, "p", asp=1)
# ...

編集:

これが私が今持っているものの直接的な例です:

> par(mfrow=c(2,2))
> for (n in 1:4) { plot(iris$Petal.Width, rnorm(length(iris$Petal.Width)), "p", asp=1) }

これにより、適切なタイプの散布が作成されますが、スケールが異なります。上記の呼び出しごとに と を同じに設定ylimしても、問題は解決しません。軸ごとに非常に異なる目盛りと目盛り番号が得られるため、散布図の解釈が不必要に難しくなります。X軸とY軸を同じにしたい。たとえば、次のようになります。xlimplot

for (n in 1:4) { plot(iris$Petal.Width, rnorm(length(iris$Petal.Width)), "p", asp=1, xlim=c(-4, 6), ylim=c(-2, 4)) }

間違った結果を生成します:

ここに画像の説明を入力

すべてのサブプロットで同じ軸が使用されるようにする最善の方法は何ですか?

私が探していたのは、すべてのサブプロットで軸を共有して同一にするための のデフォルトの動作のように聞こえる のようaxis=sameなパラメータです。par(mfrow=...)lattice

lgautier は ggplot で素晴らしいコードを提供しましたが、事前に軸を知る必要があります。各サブプロットのデータを反復処理して、プロットする正しいティックを自分で計算することを避けたかったことを明確にしたいと思います。plotそれを事前に知る必要がある場合、ggplot ソリューションは、明示的にプロットするよりもはるかに複雑です。

agstudy は格子で解を与えました。これは、各散布図の目盛り位置を明示的に事前計算する必要がないという点で、私が望むものに最も近いように見えますが、新しいユーザーとして、格子を通常のプロットのように見せる方法を理解できません。私が得た最も近いものはこれです:

> xyplot(y~x|group, data =dat, type='p',
        between =list(y=2,x=2),
        layout=c(2,2), aspect=1,
               scales =list(y = list(relation='same'), alternating=FALSE))

これにより、次の結果が得られます。

ここに画像の説明を入力

これをRベースのように見せるにはどうすればよいですか? これらのgroup字幕を各サブプロットの上部に表示したり、各散布図の上部と右側にラベルのない目盛りを付けたりしたくありません。散布図の各 x と y にラベルを付けたいだけです。X と Y の共有ラベルも探していません。各サブプロットは独自の X と Y ラベルを取得します。また、ここで選択したデータでは意味がありませんが、軸ラベルは各散布図で同じでなければなりません。

トレリスを R ベースのように見せる簡単な方法がない限り、各サブプロットの各ティックの正確な位置を事前に計算することなく、(驚くべきことに) R でやろうとしていることを行う方法はないように思えます。 、事前にデータを反復処理する必要があります。

4

3 に答える 3

3

ggplot2 は、最初はかなり/簡単な比率が最も高い可能性があります。

rpy2 の例:

from rpy2.robjects.lib import ggplot2
from rpy2.robjects import r, Formula

iris = r('iris')

p = ggplot2.ggplot(iris) + \
    ggplot2.geom_point(ggplot2.aes_string(x="Sepal.Length", y="Sepal.Width")) + \
    ggplot2.facet_wrap(Formula('~ Species'), ncol=2, nrow = 2) + \
    ggplot2.GBaseObject(r('ggplot2::coord_fixed')()) # aspect ratio
# coord_fixed() missing from the interface, 
# therefore the hack. This should be fixed in rpy2-2.3.3

p.plot()

以前の回答へのコメントを読むと、完全に別のプロットを意味している可能性があることがわかります。Rのデフォルトのプロットシステムを使用するpar(mfrow(c(2,2))par(mfcol(c(2,2)))、最も簡単な方法で、縦横比、軸の範囲、および目盛りを通常の方法で一貫して固定します。

R でプロットする最も柔軟なシステムはgrid. 見た目ほど悪くはありませんが、シーングラフとして考えてみてください。rpy2、ggplot2、およびグリッドを使用:

from rpy2.robjects.vectors import FloatVector

from rpy2.robjects.lib import grid
grid.newpage()
lt = grid.layout(2,2) # 2x2 layout
vp = grid.viewport(layout = lt)
vp.push()


# limits for axes and tickmarks have to be known or computed beforehand
xlims = FloatVector((4, 9))
xbreaks = FloatVector((4,6,8))
ylims = FloatVector((-3, 3))
ybreaks = FloatVector((-2, 0, 2))

# first panel
vp_p = grid.viewport(**{'layout.pos.col':1, 'layout.pos.row': 1})
p = ggplot2.ggplot(iris) + \
    ggplot2.geom_point(ggplot2.aes_string(x="Sepal.Length",
                                          y="rnorm(nrow(iris))")) + \
    ggplot2.GBaseObject(r('ggplot2::coord_fixed')()) + \
    ggplot2.scale_x_continuous(limits = xlims, breaks = xbreaks) + \
    ggplot2.scale_y_continuous(limits = ylims, breaks = ybreaks)
p.plot(vp = vp_p)
# third panel
vp_p = grid.viewport(**{'layout.pos.col':2, 'layout.pos.row': 2})
p = ggplot2.ggplot(iris) + \
    ggplot2.geom_point(ggplot2.aes_string(x="Sepal.Length",
                                          y="rnorm(nrow(iris))")) + \
    ggplot2.GBaseObject(r('ggplot2::coord_fixed')()) + \
    ggplot2.scale_x_continuous(limits = xlims, breaks = xbreaks) + \
    ggplot2.scale_y_continuous(limits = ylims, breaks = ybreaks)
p.plot(vp = vp_p)

graphics に関する rpy2 ドキュメントのその他のドキュメント、および ggplot2 および grid ドキュメントの後のドキュメント。

于 2013-02-16T07:46:56.943 に答える
3

とデータを再形成する必要がありますlatticeggplot2例えば:

  1. 4 data.frame(x=x1,y=y1)...を作成
  2. 各 data.frame, group=1,2,... にグループ列を追加します。
  3. 一度に4つのdata.frameをrbind

ここで使用例lattice

dat <- data.frame(x = rep(sample(1:100,size=10),4),
                  y = rep(rnorm(40)),
                  group = rep(1:4,each =10))

xyplot(y~x|group,       ## conditional formula to get 4 panels
       data =dat,       ## data
       type='l',        ## line type for plot
       groups=group,     ## group ti get differents colors
       layout=c(2,2))   ## equivalent to par or layout

ここに画像の説明を入力

PS : サクルをセットする必要はありません。デフォルトのsaclesxyplot設定はsame(すべてのパネルで同じ sacles) です。たとえば、次のように変更できます。

xyplot(y~x|group, data =dat, type='l',groups=group,
       layout=c(2,2), scales =list(y = list(relation='free')))

編集

プロットの多くの詳細を制御できるように、格子プロット関数には多数の引数があります。たとえば、次のようにカスタマイズします。

  1. ストリップのラベルとタイトルに使用するテキスト
  2. 軸の目盛りラベルのサイズと配置、
  3. パネルの列と行の間のギャップのサイズ。

    xyplot(y~x|group, data =dat, type='l',groups=group,
          between =list(y=2,x=2),
          layout=c(2,2), 
          strip = myStrip,
          scales =list(y = list(relation='same',alternating= c(3,3))))
    

どこ

myStrip <- function(var.name,which.panel, which.given,...) {
  var.name <- paste(var.name ,which.panel)
  strip.default(which.given,which.panel,var.name,...)
  }

ここに画像の説明を入力

編集ラティス プロット ベース グラフィックス プロットを取得するために、これを試すことができます。

xyplot(y~x|group, data =dat, type='l',groups=group,
       between=list(y=2,x=2),
       layout=c(2,2), 
       strip =FALSE,
       xlab=c('a','a'),
       xlab.top=c('a','a'),
       ylab=c('b','b'),
       ylab.right = c('b','b'),
       main=c('plot1','plot2'),
       sub=c('plot3','plot4'),
       scales =list(y = list(alternating= c(3,3)),
                    x = list(alternating= c(3,3))))

ここに画像の説明を入力

于 2013-02-15T23:50:40.293 に答える
2

回答はすでに選択されていますが、その回答はggplotベース R ではなく、OP が望んでいたものを使用しています。迅速なプロットには非常に便利ですがggplot、出版物では、オファーよりもプロットを細かく制御したいことがよくありggplotます。それがベースプロットが優れているところです。

を巧みに使用して機能する魔法についてのSean Anderson の説明と、およびparを使用するような他のいくつかの優れたトリックを読むことをお勧めします。layout()split.screen()

彼の説明を使用して、私はこれを思いつきました:

# Assume that you are starting with some data, 
# rather than generating it on the fly
data_mat <- matrix(rnorm(600), nrow=4, ncol=150)
x_val <- iris$Petal.Width

Ylim <- c(-3, 3)
Xlim <- c(0, 2.5)

# You'll need to make the ylimits the same if you want to share axes


par(mfrow=c(2,2))
par(mar=c(0,0,0,0), oma=c(4,4,0.5,0.5))
par(mgp=c(1, 0.6, 0.5))
for (n in 1:4) { 
  plot(x_val, data_mat[n,], "p", asp=1, axes=FALSE, ylim=Ylim, xlim=Xlim)
  box()
  if(n %in% c(1,3)){
    axis(2, at=seq(Ylim[1]+0.5, Ylim[2]-0.5, by=0.5))
  }
  if(n %in% c(3,4)){
    axis(1, at=seq(min(x_val), max(x_val), by=0.1))
  }
}

マージンを共有してプロットする

ここでまだやるべきことがいくつかあります。OPと同じように、データが途中で押しつぶされて表示されます。もちろん、プロット領域全体が使用されるように調整するのは良いことです。

于 2014-09-10T20:15:15.647 に答える