R巧妙地决定函数中的par-mfrow

Posted

技术标签:

【中文标题】R巧妙地决定函数中的par-mfrow【英文标题】:R smartly deciding about par-mfrow in a function 【发布时间】:2013-01-25 13:13:51 【问题描述】:

我想根据数据框中具有超过 10 个唯一值的变量的数量来打印输出。这可以是任意数量的变量。我正在寻找一种方法来实现这一点,以便将绘图窗口设置为适合变量数量。

应该是这样的:

2 个变量 -> 1 乘 2 3 个变量 -> 1 乘 3 4 个变量 -> 2 乘 2 5 个变量 -> 2 x 3 6 个变量 -> 2 乘 3 ..... ..... 16 个变量 -> 4 x 4 16+ 变量 -> 4 x 4

这有什么逻辑公式吗?

如何把它变成一个成功的par(mfrow=(c(x,y)))

另外,如何确定何时达到了par限制,下一个窗口到click,当我有超过16个时我不能点击,而是覆盖之前的图表。

【问题讨论】:

我不太了解您想要实现的目标。听起来你想刻画一个情节?如果是这样,你可以use ggplot2。 @Roland 并非所有函数/包都使用 ggplot2,因为它们的绘图和分面与 mfrow 对绘图设备所做的不同。 以下答案似乎都没有解决当地块编号>16 时使用单击继续下一个地块的问题。 @GavinSimpson 我很清楚这一点,并且自己经常使用基本图形。但正如我所说,我什至不明白这个问题。第一句话可能意味着很多事情。 @Marcinthebox 你不能轻易做到这一点。 locator(1) 在称为 if loop index > 16、32 等的循环中将强制用户单击绘图。 devAskNewPage() 可用于控制台中的提示。 【参考方案1】:

获取设备的行数和列数

n2mfrow() 就是为此目的而设计的,尽管它往往比列更快地改变行,因此与您想要的相反。例如:

> n2mfrow(2)
[1] 2 1

表示 2 行乘 1 列。当然,rev() 可以很容易地得到你想要的输出:

> rev(n2mfrow(3))
[1] 1 3

这里是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

进行互动

对于“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)

类似的事情可以使用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)

【讨论】:

甚至可能不使用rev() 应该是首选。我得考虑一下。 如果你想要区域大小不等,layout() 函数提供了一个替代方案.. 我让 devAskNewPage 工作了。就我而言,我必须减去 for 循环整数 i - the amount of ordinal variables %% 16 == 0 的情况。 @Dualinity 和devAskNewPage() 你只需要调用一次,因为它只影响设备的新页面而不是绘图窗口。请参阅我更新的答案 - 您只需在情节 1 完成后将其打开。如果你在循环之前设置它,那么你会在绘制第一个图之前被询问,这不是我们想要的。 @GavinSimpson 明白了。改为:if ((i - ord) == 16) devAskNewPage(ask = TRUE)(循环内)

以上是关于R巧妙地决定函数中的par-mfrow的主要内容,如果未能解决你的问题,请参考以下文章

JS函数

R 闪亮并巧妙地获得图例点击事件

excel曲线拟合中的决定系数R平方是如何求出来的?

计蒜客 贝壳找房函数最值(好题,巧妙排序)

如何在 R 中的单个数据帧上迭代地应用函数?

Frequent values UVA - 11235(巧妙地RMQ)