【问题标题】:Multiple plots with high-level plotting functions, especially plot.rqs()具有高级绘图功能的多个绘图,尤其是 plot.rqs()
【发布时间】:2012-03-12 01:14:22
【问题描述】:

我正在尝试将两个回归摘要与一个居中的标题并排绘制。每个回归摘要由plot.rqs() 生成,总共有 9 个图。

我已经尝试过使用par(mfrow=c(1,2)),但正如我从 Paul Murrel (2006) 的书中了解到的那样,像 plot.rqs()pairs() 这样的高级函数会在绘制之前保存图形状态,然后再恢复一次图形状态已完成,因此对par()layout() 的抢先呼叫无法帮助我。 plot.rqs() 也没有“面板”功能。

看来实现结果的唯一办法就是修改plot.rqs()函数,得到一个新函数,比如说modified.plot.rqs(),然后运行

par(mfrow=c(1,2))
modified.plot.rqs(summary(fit1))
modified.plot.rqs(summary(fit2))
par(mfrow=c(1,1))

从那里我也许可以弄清楚如何使用layout() 为图像添加整体标题。有谁知道如何创建可以以这种方式使用的modified.plot.rqs() 函数?

谢谢

【问题讨论】:

  • 您可以查看plot.rqs(或plot.summary.rqs)并删除有问题的par 调用。
  • 是的,我试过了,但我最终得到了错误消息:“x$tau 中的错误:$ 运算符对原子向量无效”。我认为这是我做错了什么:(

标签: r plot


【解决方案1】:

您可以按如下方式修补函数: 使用dputcapture.output 检索 函数的代码,作为字符串; 根据需要更改它(在这里,我只是替换每次出现的par 一个什么都不做的函数); 最后评估结果以生成新函数。

library(quantreg)
a <- capture.output(dput(plot.summary.rqs))
b <- gsub("^\\s*par\\(", "nop(", a)
nop <- function(...) {}
my.plot.summary.rqs <- eval(parse(text=b))

【讨论】:

  • 哇。文森特,这相当巧妙。我一直只是将控制台输出复制到屏幕或编辑器。
  • @DWin:但这并不总是足够的,例如,如果函数使用非导出函数(可能很容易用environment(f) &lt;- ... 修复),或者更糟糕的是,如果你想要修改的是在非导出函数中。
  • 谢谢文森特!当我在 example(plot.rqs) fit 'fm' 上运行它时,我收到以下错误消息: x$tau 中的错误:$ 运算符对原子向量无效
  • 有两个函数:plot.rqsplot.summary.rqs,分别作用于 rqssummary.rqs 类型的对象。如果将它们混合在一起,则会收到您提到的错误消息。以下作品:my.plot.summary.rqs(summary(fm)).
【解决方案2】:

首先我们生成一个示例对象 fm 。然后我们复制plot.rqs 并在副本上使用trace 以在顶部插入par &lt;- list,从而有效地取消函数内par 的任何使用。然后我们对plot.summary.rqs 做同样的事情。最后我们用我们自己的par来测试它:

library(quantreg)
example(plot.rqs) # fm to use in example

# plot.rqs
plot.rqs <- quantreg::plot.rqs
trace("plot.rqs", quote(par <- list), print = FALSE)

# plot.summary.rqs
plot.summary.rqs <- quantreg::plot.summary.rqs
trace("plot.summary.rqs", quote(par <- list), print = FALSE)

# test it out
op <- par(mfrow = c(2, 2))

plot(summary(fm))
plot(fm)
title("My Plots", outer = TRUE, line = -1)

par(op)

编辑:添加plot.summary.rqs

【讨论】:

  • 谢谢!工作得几乎完美,除了当我运行它时,情节是一个在另一个之下而不是并排的。我可以用 layout(matrix(c(1,2,3,4),ncol=2,byrow=FALSE)) 替换 op
  • 哦,当我用 plot(summary(fm)) 替换 plot(fm) 时,代码不再起作用。似乎这两个绘图函数忽略了 par() 并在同一个地方绘制。我的结果只有在我使用 plot(summary()) 时才可见...关于如何解决它的任何想法?
  • 已经添加了plot.summary.rqs,所以现在这个例子显示了两者。
  • 关于您对mfrow 的评论,请注意mfcol 也存在。
猜你喜欢
  • 2020-10-27
  • 1970-01-01
  • 2020-04-03
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多