如何在 M x N 布局中放置带有内部图的多个图而不弄乱 par()?

jay*_*.sf 4 layout plot for-loop r par

我在情节中画情节。

(为了简单起见,我curve()在这里使用,但这也指的是plot()。)

curve(exp(x), 0, 1, col=4)
.op <- par(
  fig=c(grconvertX(c(.05, .4), to='ndc'),
        grconvertY(c(2, 2.75), to='ndc')),
  mar=c(1, 1, 1, 1),
  new=TRUE
)
curve(sin(x), 0, 2*pi)
par(.op)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

循环重复这个for基本上效果很好。然而,当我尝试使用 2x2 时layout,这些数字分布在四个不同的图上,而不是显示在一个图上。

layout(matrix(1:4, 2, 2))
for (i in 1:4) {
  curve(exp(x), 0, 1, col=4)
  .op <- par(
    fig=c(grconvertX(c(.05, .3), to='ndc'),
          grconvertY(c(2, 2.75), to='ndc')),
    mar=c(1, 1, 1, 1),
    new=TRUE
  )
  curve(sin(x), 0, 2*pi)
  par(.op)
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,内部par混乱了外部。我也尝试op <- par(mfrow=); ... par(op)代替layout,但结果相同。

我该如何解决这个问题?

Edw*_*ard 5

尝试使用screen替代。

split.screen(c(2,2))
for (i in 1:4) {
  screen(i)
  curve(exp(x), 0, 1, col=4)
  title(paste("i=",i))

  .op <- par(
    fig=c(grconvertX(c(.05, .3), to='ndc'),
          grconvertY(c(2, 2.75), to='ndc')),
    mar=c(1, 1, 1, 1),
    new=TRUE
  )
  curve(sin(x), 0, 2*pi)
  par(.op)
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述