55

1 ページに 4 つのプロットを配置したいと思います。軸ラベルは一番端にのみ印刷する必要があります。つまり、x軸ラベルは下のダイアグラムのみ、y軸ラベルは左側のダイアグラムのみです。これは、軸全体の名前と個々の目盛りの両方に当てはまります。次のコードを使用して、これらの行に沿って何かを生成できます。

pdf(file = "ExampleOutput.pdf",
    width = 6.61,
    height = 6.61,
    pointsize = 10
    )
set.seed(42)
catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000"))
catB <- factor(20:28)
samples <- 100
rsample <- function(v) v[ceiling(runif(samples, max=length(v)))]
Tab <- data.frame(catA = rsample(catA),
                  catB = rsample(catB),
                  valA = rnorm(samples, 150, 8),
                  valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3))))
par(mfrow = c(2,2))
for (i in 0:3) {
  x <- Tab[[1 + i %% 2]]
  plot(x, Tab[[3 + i %/% 2]],
       xlab = if (i %/% 2 == 1) "Some Categories" else NULL,
       ylab = if (i %% 2 == 0) "Some Values" else NULL,
       axes = FALSE
       )
  axis(side = 1,
       at=1:nlevels(x),
       labels = if (i %/% 2 == 1) levels(x) else FALSE)
  axis(side = 2, labels = (i %% 2 == 0))
  box(which = "plot", bty = "l")
}
par(mfrow = c(1,1))
dev.off()

プロットコマンドを改善する方法についての提案を歓迎します。おそらく、左下隅の軸と L を手動で排出しないようにします。しかし、それはあくまでも余談です。

このシーケンスの結果は次のようになります。

電流出力

ここでの問題は、無駄な空白が大量にあることですR は、軸ラベルと目盛りラベルが使用されていなくても、そのスペースを確保している印象があります。この無駄なスペースの結果として、左下の図では、1 秒ごとのxティックだけが実際にラベル付けされます。これは、ここでは非常に悪いことです。

空白をあまり使わずに同様のプロットを生成したいと思います。実際のプロットは同じサイズにする必要があるため、適切に並べることができますが、ラベルのスペースは外側のみにする必要があります。このようなレイアウトを想像します(GIMPで作成されたモックアップ):

望ましい出力

どうすればそのようなレイアウトを実現できますか?

4

4 に答える 4

66

これは、y 軸と x 軸のラベルがすべてのプロットに関連していると仮定して、表示する一般的なプロットを少し変更したものです。外側のマージンを使用して、軸のラベル付けを含めます。これは、title()引数を使用して追加しますouter = TRUE。この効果は、ggplot2または格子プロットのラベリングに多少似ています。

ここでの重要な行は次のとおりです。

op <- par(mfrow = c(2,2),
          oma = c(5,4,0,0) + 0.1,
          mar = c(0,0,1,1) + 0.1)

プロット パラメータを設定します (呼び出し前の値は に保存されopます)。辺 1 と辺 2 の線を外側の余白に使用します。これは、パラメータの通常の数5です。上部と右側にそれぞれ 1 行のプロット領域余白 ( ) が追加され、プロット間に少し余裕ができます。4marmar

ループのに軸ラベルが追加されますfor()

title(xlab = "Some Categories",
      ylab = "Some Values",
      outer = TRUE, line = 3)

スクリプト全体は次のとおりです。

set.seed(42)
catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000"))
catB <- factor(20:28)
samples <- 100
rsample <- function(v) v[ceiling(runif(samples, max=length(v)))]
Tab <- data.frame(catA = rsample(catA),
                  catB = rsample(catB),
                  valA = rnorm(samples, 150, 8),
                  valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3))))
op <- par(mfrow = c(2,2),
          oma = c(5,4,0,0) + 0.1,
          mar = c(0,0,1,1) + 0.1)
for (i in 0:3) {
  x <- Tab[[1 + i %% 2]]
  plot(x, Tab[[3 + i %/% 2]], axes = FALSE)
  axis(side = 1,
       at=1:nlevels(x),
       labels = if (i %/% 2 == 1) levels(x) else FALSE)
  axis(side = 2, labels = (i %% 2 == 0))
  box(which = "plot", bty = "l")
}
title(xlab = "Some Categories",
      ylab = "Some Values",
      outer = TRUE, line = 3)
par(op)

生産する

ここに画像の説明を入力

于 2012-11-05T21:58:43.290 に答える
22

Gavin Simpsonからの回答に大きく基づいて、次のソリューションを使用します。

par(mfrow = c(2, 2),     # 2x2 layout
    oma = c(2, 2, 0, 0), # two rows of text at the outer left and bottom margin
    mar = c(1, 1, 0, 0), # space for one row of text at ticks and to separate plots
    mgp = c(2, 1, 0),    # axis label at 2 rows distance, tick labels at 1 row
    xpd = NA)            # allow content to protrude into outer margin (and beyond)

結果は次のようになります。

結果の画像

ご覧のとおり、これですべての目盛りラベルも印刷できます。そうでない場合は、Gavinのコメントcex.axisによると、パラメータリストに1より小さい値を追加すると、フォントサイズを小さくするのに役立ちます。

于 2012-11-06T20:46:00.623 に答える
19

でパラメータを操作するだけparです。引数marは、個々のプロットのマージン サイズを制御します。parこれを次のように変更します。

par(mfrow = c(2,2), mar=c(1, 4, 1, 1) + 0.1)#it goes c(bottom, left, top, right) 
于 2012-11-05T20:56:08.410 に答える
2

par('mar')配置に適した値に割り当てる条件付き評価が必要です。「x-layout-position」をチェックする(ループ内の)コードの例を次に示します。

    pdf(file = "ExampleOutput2.pdf",
    width = 6.61,
    height = 6.61,
    pointsize = 10
    )
set.seed(42)
catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000"))
catB <- factor(20:28)
samples <- 100
rsample <- function(v) v[ceiling(runif(samples, max=length(v)))]
Tab <- data.frame(catA = rsample(catA),
                  catB = rsample(catB),
                  valA = rnorm(samples, 150, 8),
                  valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3))))
par(mfrow = c(2,2), mar= c(3, 4, 1, 1) + 0.1)
for (i in 0:3) {
  x <- Tab[[1 + i %% 2]]
  plot(x, Tab[[3 + i %/% 2]], mar= if(i %/%2 == 0) {c(4, 4, 1, 1) + 0.1 
                                              }else{c(1, 1, 1, 1) + 0.1},
       xlab = if (i %/% 2 == 1) "Some Categories" else NULL,
       ylab = if (i %% 2 == 0) "Some Values" else NULL,
       axes = FALSE
       )
  axis(side = 1,
       at=1:nlevels(x),
       labels = if (i %/% 2 == 1) levels(x) else FALSE)
  axis(side = 2, labels = (i %% 2 == 0))
  box(which = "plot", bty = "l")
}
par(mfrow = c(1,1))
dev.off()

必要に応じてこれを調整する必要があります。これは 2 つのマージン条件のみを処理し、実際には 4 つの個別の条件があるためです (下の 2 つは下のスペースを増やす必要があり、右の条件は左のスペースを少なくする必要があり、上に 2 つの条件があります)。異なる要件) . 「mar」値をグローバルに縮小すると、このコードをループにドロップするだけで xlab 値が失われることからわかるように、x ラベルと y ラベルが切り取られます。

于 2012-11-05T21:38:08.457 に答える