R聪明地决定在函数中使用par-mfrow

Pas*_*ten 4 r par

我想根据数据框中具有10个以上唯一值的变量数量来打印输出.这可以是任意数量的变量.我正在寻找一种方法来实现这一点,以设置绘图窗口是完美的变量数量.

它应该是这样的:

  • 2个变量 - > 1乘2
  • 3个变量 - > 1乘3
  • 4个变量 - > 2乘2
  • 5个变量 - > 2乘3
  • 6个变量 - > 2乘3
  • .....
  • .....
  • 16个变量 - > 4乘4
  • 16+ vars - > 4 by 4

这有一个合乎逻辑的公式;

如何使这成为一个成功的par(mfrow=(c(x,y)))

另外,如何确保达到par限制时,click对于下一个窗口,当我超过16时我无法单击,而只是覆盖之前的图形.

Rei*_*son 11

获取设备的行数和列数

n2mfrow()是为此目的而设计的,虽然它往往比列更快地改变行,因此与你想要的相反.例如:

> n2mfrow(2)
[1] 2 1
Run Code Online (Sandbox Code Playgroud)

表示2行乘1列.当然,rev()可以轻松获得所需的输出:

> rev(n2mfrow(3))
[1] 1 3
Run Code Online (Sandbox Code Playgroud)

这里是n2mfrow()2到16个总图的输出,列的变化​​更快:

t(sapply(2:16, function(x) rev(n2mfrow(x))))

> t(sapply(2:16, function(x) rev(n2mfrow(x))))
      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    2    2
 [4,]    2    3
 [5,]    2    3
 [6,]    3    3
 [7,]    3    3
 [8,]    3    3
 [9,]    3    4
[10,]    3    4
[11,]    3    4
[12,]    4    4
[13,]    4    4
[14,]    4    4
[15,]    4    4
Run Code Online (Sandbox Code Playgroud)

使这个互动

对于"16后点击"位.如果你在一个for(i in numplots)循环中进行绘图,当i> 16调用时devAskNewPage(ask = TRUE),将提示用户激活下一个绘图.

例如:

np <- 18 ## number of plots
rc <- ifelse(np > 16, 16, np)
op <- par(mfrow = rev(n2mfrow(rc)))
for(i in seq_len(np)) {
  if(i == 2) {
    devAskNewPage(ask = TRUE)
  }
  plot(1:10)
}
par(op)
devAskNewPage(ask = FALSE)
Run Code Online (Sandbox Code Playgroud)

类似的事情可以使用locator(1)强制点击移动16柱图,但它需要更多的工作:

np <- 18 ## number of plots
rc <- ifelse(np > 16, 16, np)
op <- par(mfrow = rev(n2mfrow(rc)))
for(i in seq_len(np)) {
  if((i %% 16) + 1 == 2 && i > 1) {
    message("Page filled. Click on device to continue...")
    locator(1)
  }
  plot(1:10)
}
par(op)
Run Code Online (Sandbox Code Playgroud)